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 program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program 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
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 #define _GNU_SOURCE // for strchrnul
29 #include <rpc/types.h>
33 #include "../src/guestfs_protocol.h"
36 static void mount_stub (XDR *xdr_in)
39 struct guestfs_mount_args args;
41 const char *mountpoint;
43 memset (&args, 0, sizeof args);
45 if (!xdr_guestfs_mount_args (xdr_in, &args)) {
46 reply_with_error ("mount: daemon failed to decode procedure arguments");
50 mountpoint = args.mountpoint;
52 r = do_mount (device, mountpoint);
54 /* do_mount has already called reply_with_error, so just return */
60 static void sync_stub (XDR *xdr_in)
66 /* do_sync has already called reply_with_error, so just return */
72 static void touch_stub (XDR *xdr_in)
75 struct guestfs_touch_args args;
78 memset (&args, 0, sizeof args);
80 if (!xdr_guestfs_touch_args (xdr_in, &args)) {
81 reply_with_error ("touch: daemon failed to decode procedure arguments");
88 /* do_touch has already called reply_with_error, so just return */
94 static void cat_stub (XDR *xdr_in)
97 struct guestfs_cat_args args;
100 memset (&args, 0, sizeof args);
102 if (!xdr_guestfs_cat_args (xdr_in, &args)) {
103 reply_with_error ("cat: daemon failed to decode procedure arguments");
110 /* do_cat has already called reply_with_error, so just return */
113 struct guestfs_cat_ret ret;
115 reply ((xdrproc_t) &xdr_guestfs_cat_ret, (char *) &ret);
119 static void ll_stub (XDR *xdr_in)
122 struct guestfs_ll_args args;
123 const char *directory;
125 memset (&args, 0, sizeof args);
127 if (!xdr_guestfs_ll_args (xdr_in, &args)) {
128 reply_with_error ("ll: daemon failed to decode procedure arguments");
131 directory = args.directory;
133 r = do_ll (directory);
135 /* do_ll has already called reply_with_error, so just return */
138 struct guestfs_ll_ret ret;
140 reply ((xdrproc_t) &xdr_guestfs_ll_ret, (char *) &ret);
144 static void ls_stub (XDR *xdr_in)
147 struct guestfs_ls_args args;
148 const char *directory;
150 memset (&args, 0, sizeof args);
152 if (!xdr_guestfs_ls_args (xdr_in, &args)) {
153 reply_with_error ("ls: daemon failed to decode procedure arguments");
156 directory = args.directory;
158 r = do_ls (directory);
160 /* do_ls has already called reply_with_error, so just return */
163 struct guestfs_ls_ret ret;
164 ret.listing.listing_len = count_strings (r);
165 ret.listing.listing_val = r;
166 reply ((xdrproc_t) &xdr_guestfs_ls_ret, (char *) &ret);
170 static void list_devices_stub (XDR *xdr_in)
174 r = do_list_devices ();
176 /* do_list_devices has already called reply_with_error, so just return */
179 struct guestfs_list_devices_ret ret;
180 ret.devices.devices_len = count_strings (r);
181 ret.devices.devices_val = r;
182 reply ((xdrproc_t) &xdr_guestfs_list_devices_ret, (char *) &ret);
186 static void list_partitions_stub (XDR *xdr_in)
190 r = do_list_partitions ();
192 /* do_list_partitions has already called reply_with_error, so just return */
195 struct guestfs_list_partitions_ret ret;
196 ret.partitions.partitions_len = count_strings (r);
197 ret.partitions.partitions_val = r;
198 reply ((xdrproc_t) &xdr_guestfs_list_partitions_ret, (char *) &ret);
202 static void pvs_stub (XDR *xdr_in)
208 /* do_pvs has already called reply_with_error, so just return */
211 struct guestfs_pvs_ret ret;
212 ret.physvols.physvols_len = count_strings (r);
213 ret.physvols.physvols_val = r;
214 reply ((xdrproc_t) &xdr_guestfs_pvs_ret, (char *) &ret);
218 static void vgs_stub (XDR *xdr_in)
224 /* do_vgs has already called reply_with_error, so just return */
227 struct guestfs_vgs_ret ret;
228 ret.volgroups.volgroups_len = count_strings (r);
229 ret.volgroups.volgroups_val = r;
230 reply ((xdrproc_t) &xdr_guestfs_vgs_ret, (char *) &ret);
234 static void lvs_stub (XDR *xdr_in)
240 /* do_lvs has already called reply_with_error, so just return */
243 struct guestfs_lvs_ret ret;
244 ret.logvols.logvols_len = count_strings (r);
245 ret.logvols.logvols_val = r;
246 reply ((xdrproc_t) &xdr_guestfs_lvs_ret, (char *) &ret);
250 static void pvs_full_stub (XDR *xdr_in)
252 guestfs_lvm_int_pv_list *r;
256 /* do_pvs_full has already called reply_with_error, so just return */
259 struct guestfs_pvs_full_ret ret;
261 reply ((xdrproc_t) &xdr_guestfs_pvs_full_ret, (char *) &ret);
262 xdr_free ((xdrproc_t) xdr_guestfs_pvs_full_ret, (char *) &ret);
265 static void vgs_full_stub (XDR *xdr_in)
267 guestfs_lvm_int_vg_list *r;
271 /* do_vgs_full has already called reply_with_error, so just return */
274 struct guestfs_vgs_full_ret ret;
276 reply ((xdrproc_t) &xdr_guestfs_vgs_full_ret, (char *) &ret);
277 xdr_free ((xdrproc_t) xdr_guestfs_vgs_full_ret, (char *) &ret);
280 static void lvs_full_stub (XDR *xdr_in)
282 guestfs_lvm_int_lv_list *r;
286 /* do_lvs_full has already called reply_with_error, so just return */
289 struct guestfs_lvs_full_ret ret;
291 reply ((xdrproc_t) &xdr_guestfs_lvs_full_ret, (char *) &ret);
292 xdr_free ((xdrproc_t) xdr_guestfs_lvs_full_ret, (char *) &ret);
295 static void read_lines_stub (XDR *xdr_in)
298 struct guestfs_read_lines_args args;
301 memset (&args, 0, sizeof args);
303 if (!xdr_guestfs_read_lines_args (xdr_in, &args)) {
304 reply_with_error ("read_lines: daemon failed to decode procedure arguments");
309 r = do_read_lines (path);
311 /* do_read_lines has already called reply_with_error, so just return */
314 struct guestfs_read_lines_ret ret;
315 ret.lines.lines_len = count_strings (r);
316 ret.lines.lines_val = r;
317 reply ((xdrproc_t) &xdr_guestfs_read_lines_ret, (char *) &ret);
321 void dispatch_incoming_message (XDR *xdr_in)
324 case GUESTFS_PROC_MOUNT:
327 case GUESTFS_PROC_SYNC:
330 case GUESTFS_PROC_TOUCH:
333 case GUESTFS_PROC_CAT:
336 case GUESTFS_PROC_LL:
339 case GUESTFS_PROC_LS:
342 case GUESTFS_PROC_LIST_DEVICES:
343 list_devices_stub (xdr_in);
345 case GUESTFS_PROC_LIST_PARTITIONS:
346 list_partitions_stub (xdr_in);
348 case GUESTFS_PROC_PVS:
351 case GUESTFS_PROC_VGS:
354 case GUESTFS_PROC_LVS:
357 case GUESTFS_PROC_PVS_FULL:
358 pvs_full_stub (xdr_in);
360 case GUESTFS_PROC_VGS_FULL:
361 vgs_full_stub (xdr_in);
363 case GUESTFS_PROC_LVS_FULL:
364 lvs_full_stub (xdr_in);
366 case GUESTFS_PROC_READ_LINES:
367 read_lines_stub (xdr_in);
370 reply_with_error ("dispatch_incoming_message: unknown procedure number %d", proc_nr);
374 static const char *lvm_pv_cols = "pv_name,pv_uuid,pv_fmt,pv_size,dev_size,pv_free,pv_used,pv_attr,pv_pe_count,pv_pe_alloc_count,pv_tags,pe_start,pv_mda_count,pv_mda_free";
376 static int lvm_tokenize_pv (char *str, struct guestfs_lvm_int_pv *r)
378 char *tok, *p, *next;
382 fprintf (stderr, "%s: failed: passed a NULL string\n", __func__);
385 if (!*str || isspace (*str)) {
386 fprintf (stderr, "%s: failed: passed a empty string or one beginning with whitespace\n", __func__);
391 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_name");
394 p = strchrnul (tok, ',');
395 if (*p) next = p+1; else next = NULL;
397 r->pv_name = strdup (tok);
398 if (r->pv_name == NULL) {
404 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_uuid");
407 p = strchrnul (tok, ',');
408 if (*p) next = p+1; else next = NULL;
410 for (i = j = 0; i < 32; ++j) {
411 if (tok[j] == '\0') {
412 fprintf (stderr, "%s: failed to parse UUID from '%s'\n", __func__, tok);
414 } else if (tok[j] != '-')
415 r->pv_uuid[i++] = tok[j];
419 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_fmt");
422 p = strchrnul (tok, ',');
423 if (*p) next = p+1; else next = NULL;
425 r->pv_fmt = strdup (tok);
426 if (r->pv_fmt == NULL) {
432 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_size");
435 p = strchrnul (tok, ',');
436 if (*p) next = p+1; else next = NULL;
438 if (sscanf (tok, "%"SCNu64, &r->pv_size) != 1) {
439 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "pv_size");
444 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "dev_size");
447 p = strchrnul (tok, ',');
448 if (*p) next = p+1; else next = NULL;
450 if (sscanf (tok, "%"SCNu64, &r->dev_size) != 1) {
451 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "dev_size");
456 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_free");
459 p = strchrnul (tok, ',');
460 if (*p) next = p+1; else next = NULL;
462 if (sscanf (tok, "%"SCNu64, &r->pv_free) != 1) {
463 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "pv_free");
468 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_used");
471 p = strchrnul (tok, ',');
472 if (*p) next = p+1; else next = NULL;
474 if (sscanf (tok, "%"SCNu64, &r->pv_used) != 1) {
475 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "pv_used");
480 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_attr");
483 p = strchrnul (tok, ',');
484 if (*p) next = p+1; else next = NULL;
486 r->pv_attr = strdup (tok);
487 if (r->pv_attr == NULL) {
493 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_pe_count");
496 p = strchrnul (tok, ',');
497 if (*p) next = p+1; else next = NULL;
499 if (sscanf (tok, "%"SCNi64, &r->pv_pe_count) != 1) {
500 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "pv_pe_count");
505 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_pe_alloc_count");
508 p = strchrnul (tok, ',');
509 if (*p) next = p+1; else next = NULL;
511 if (sscanf (tok, "%"SCNi64, &r->pv_pe_alloc_count) != 1) {
512 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "pv_pe_alloc_count");
517 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_tags");
520 p = strchrnul (tok, ',');
521 if (*p) next = p+1; else next = NULL;
523 r->pv_tags = strdup (tok);
524 if (r->pv_tags == NULL) {
530 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pe_start");
533 p = strchrnul (tok, ',');
534 if (*p) next = p+1; else next = NULL;
536 if (sscanf (tok, "%"SCNu64, &r->pe_start) != 1) {
537 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "pe_start");
542 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_mda_count");
545 p = strchrnul (tok, ',');
546 if (*p) next = p+1; else next = NULL;
548 if (sscanf (tok, "%"SCNi64, &r->pv_mda_count) != 1) {
549 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "pv_mda_count");
554 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_mda_free");
557 p = strchrnul (tok, ',');
558 if (*p) next = p+1; else next = NULL;
560 if (sscanf (tok, "%"SCNu64, &r->pv_mda_free) != 1) {
561 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "pv_mda_free");
566 fprintf (stderr, "%s: failed: extra tokens at end of string\n", __func__);
572 guestfs_lvm_int_pv_list *
573 parse_command_line_pvs (void)
578 guestfs_lvm_int_pv_list *ret;
581 ret = malloc (sizeof *ret);
583 reply_with_perror ("malloc");
587 ret->guestfs_lvm_int_pv_list_len = 0;
588 ret->guestfs_lvm_int_pv_list_val = NULL;
590 r = command (&out, &err,
592 "-o", lvm_pv_cols, "--unbuffered", "--noheadings",
593 "--nosuffix", "--separator", ",", "--units", "b", NULL);
595 reply_with_error ("%s", err);
603 /* Tokenize each line of the output. */
607 pend = strchr (p, '\n'); /* Get the next line of output. */
613 while (*p && isspace (*p)) /* Skip any leading whitespace. */
616 if (!*p) { /* Empty line? Skip it. */
621 /* Allocate some space to store this next entry. */
622 newp = realloc (ret->guestfs_lvm_int_pv_list_val,
623 sizeof (guestfs_lvm_int_pv) * (i+1));
625 reply_with_perror ("realloc");
626 free (ret->guestfs_lvm_int_pv_list_val);
631 ret->guestfs_lvm_int_pv_list_val = newp;
633 /* Tokenize the next entry. */
634 r = lvm_tokenize_pv (p, &ret->guestfs_lvm_int_pv_list_val[i]);
636 reply_with_error ("failed to parse output of 'pvs' command");
637 free (ret->guestfs_lvm_int_pv_list_val);
647 ret->guestfs_lvm_int_pv_list_len = i;
652 static const char *lvm_vg_cols = "vg_name,vg_uuid,vg_fmt,vg_attr,vg_size,vg_free,vg_sysid,vg_extent_size,vg_extent_count,vg_free_count,max_lv,max_pv,pv_count,lv_count,snap_count,vg_seqno,vg_tags,vg_mda_count,vg_mda_free";
654 static int lvm_tokenize_vg (char *str, struct guestfs_lvm_int_vg *r)
656 char *tok, *p, *next;
660 fprintf (stderr, "%s: failed: passed a NULL string\n", __func__);
663 if (!*str || isspace (*str)) {
664 fprintf (stderr, "%s: failed: passed a empty string or one beginning with whitespace\n", __func__);
669 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_name");
672 p = strchrnul (tok, ',');
673 if (*p) next = p+1; else next = NULL;
675 r->vg_name = strdup (tok);
676 if (r->vg_name == NULL) {
682 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_uuid");
685 p = strchrnul (tok, ',');
686 if (*p) next = p+1; else next = NULL;
688 for (i = j = 0; i < 32; ++j) {
689 if (tok[j] == '\0') {
690 fprintf (stderr, "%s: failed to parse UUID from '%s'\n", __func__, tok);
692 } else if (tok[j] != '-')
693 r->vg_uuid[i++] = tok[j];
697 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_fmt");
700 p = strchrnul (tok, ',');
701 if (*p) next = p+1; else next = NULL;
703 r->vg_fmt = strdup (tok);
704 if (r->vg_fmt == NULL) {
710 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_attr");
713 p = strchrnul (tok, ',');
714 if (*p) next = p+1; else next = NULL;
716 r->vg_attr = strdup (tok);
717 if (r->vg_attr == NULL) {
723 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_size");
726 p = strchrnul (tok, ',');
727 if (*p) next = p+1; else next = NULL;
729 if (sscanf (tok, "%"SCNu64, &r->vg_size) != 1) {
730 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "vg_size");
735 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_free");
738 p = strchrnul (tok, ',');
739 if (*p) next = p+1; else next = NULL;
741 if (sscanf (tok, "%"SCNu64, &r->vg_free) != 1) {
742 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "vg_free");
747 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_sysid");
750 p = strchrnul (tok, ',');
751 if (*p) next = p+1; else next = NULL;
753 r->vg_sysid = strdup (tok);
754 if (r->vg_sysid == NULL) {
760 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_extent_size");
763 p = strchrnul (tok, ',');
764 if (*p) next = p+1; else next = NULL;
766 if (sscanf (tok, "%"SCNu64, &r->vg_extent_size) != 1) {
767 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "vg_extent_size");
772 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_extent_count");
775 p = strchrnul (tok, ',');
776 if (*p) next = p+1; else next = NULL;
778 if (sscanf (tok, "%"SCNi64, &r->vg_extent_count) != 1) {
779 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "vg_extent_count");
784 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_free_count");
787 p = strchrnul (tok, ',');
788 if (*p) next = p+1; else next = NULL;
790 if (sscanf (tok, "%"SCNi64, &r->vg_free_count) != 1) {
791 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "vg_free_count");
796 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "max_lv");
799 p = strchrnul (tok, ',');
800 if (*p) next = p+1; else next = NULL;
802 if (sscanf (tok, "%"SCNi64, &r->max_lv) != 1) {
803 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "max_lv");
808 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "max_pv");
811 p = strchrnul (tok, ',');
812 if (*p) next = p+1; else next = NULL;
814 if (sscanf (tok, "%"SCNi64, &r->max_pv) != 1) {
815 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "max_pv");
820 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_count");
823 p = strchrnul (tok, ',');
824 if (*p) next = p+1; else next = NULL;
826 if (sscanf (tok, "%"SCNi64, &r->pv_count) != 1) {
827 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "pv_count");
832 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_count");
835 p = strchrnul (tok, ',');
836 if (*p) next = p+1; else next = NULL;
838 if (sscanf (tok, "%"SCNi64, &r->lv_count) != 1) {
839 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "lv_count");
844 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "snap_count");
847 p = strchrnul (tok, ',');
848 if (*p) next = p+1; else next = NULL;
850 if (sscanf (tok, "%"SCNi64, &r->snap_count) != 1) {
851 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "snap_count");
856 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_seqno");
859 p = strchrnul (tok, ',');
860 if (*p) next = p+1; else next = NULL;
862 if (sscanf (tok, "%"SCNi64, &r->vg_seqno) != 1) {
863 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "vg_seqno");
868 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_tags");
871 p = strchrnul (tok, ',');
872 if (*p) next = p+1; else next = NULL;
874 r->vg_tags = strdup (tok);
875 if (r->vg_tags == NULL) {
881 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_mda_count");
884 p = strchrnul (tok, ',');
885 if (*p) next = p+1; else next = NULL;
887 if (sscanf (tok, "%"SCNi64, &r->vg_mda_count) != 1) {
888 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "vg_mda_count");
893 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_mda_free");
896 p = strchrnul (tok, ',');
897 if (*p) next = p+1; else next = NULL;
899 if (sscanf (tok, "%"SCNu64, &r->vg_mda_free) != 1) {
900 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "vg_mda_free");
905 fprintf (stderr, "%s: failed: extra tokens at end of string\n", __func__);
911 guestfs_lvm_int_vg_list *
912 parse_command_line_vgs (void)
917 guestfs_lvm_int_vg_list *ret;
920 ret = malloc (sizeof *ret);
922 reply_with_perror ("malloc");
926 ret->guestfs_lvm_int_vg_list_len = 0;
927 ret->guestfs_lvm_int_vg_list_val = NULL;
929 r = command (&out, &err,
931 "-o", lvm_vg_cols, "--unbuffered", "--noheadings",
932 "--nosuffix", "--separator", ",", "--units", "b", NULL);
934 reply_with_error ("%s", err);
942 /* Tokenize each line of the output. */
946 pend = strchr (p, '\n'); /* Get the next line of output. */
952 while (*p && isspace (*p)) /* Skip any leading whitespace. */
955 if (!*p) { /* Empty line? Skip it. */
960 /* Allocate some space to store this next entry. */
961 newp = realloc (ret->guestfs_lvm_int_vg_list_val,
962 sizeof (guestfs_lvm_int_vg) * (i+1));
964 reply_with_perror ("realloc");
965 free (ret->guestfs_lvm_int_vg_list_val);
970 ret->guestfs_lvm_int_vg_list_val = newp;
972 /* Tokenize the next entry. */
973 r = lvm_tokenize_vg (p, &ret->guestfs_lvm_int_vg_list_val[i]);
975 reply_with_error ("failed to parse output of 'vgs' command");
976 free (ret->guestfs_lvm_int_vg_list_val);
986 ret->guestfs_lvm_int_vg_list_len = i;
991 static const char *lvm_lv_cols = "lv_name,lv_uuid,lv_attr,lv_major,lv_minor,lv_kernel_major,lv_kernel_minor,lv_size,seg_count,origin,snap_percent,copy_percent,move_pv,lv_tags,mirror_log,modules";
993 static int lvm_tokenize_lv (char *str, struct guestfs_lvm_int_lv *r)
995 char *tok, *p, *next;
999 fprintf (stderr, "%s: failed: passed a NULL string\n", __func__);
1002 if (!*str || isspace (*str)) {
1003 fprintf (stderr, "%s: failed: passed a empty string or one beginning with whitespace\n", __func__);
1008 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_name");
1011 p = strchrnul (tok, ',');
1012 if (*p) next = p+1; else next = NULL;
1014 r->lv_name = strdup (tok);
1015 if (r->lv_name == NULL) {
1021 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_uuid");
1024 p = strchrnul (tok, ',');
1025 if (*p) next = p+1; else next = NULL;
1027 for (i = j = 0; i < 32; ++j) {
1028 if (tok[j] == '\0') {
1029 fprintf (stderr, "%s: failed to parse UUID from '%s'\n", __func__, tok);
1031 } else if (tok[j] != '-')
1032 r->lv_uuid[i++] = tok[j];
1036 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_attr");
1039 p = strchrnul (tok, ',');
1040 if (*p) next = p+1; else next = NULL;
1042 r->lv_attr = strdup (tok);
1043 if (r->lv_attr == NULL) {
1049 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_major");
1052 p = strchrnul (tok, ',');
1053 if (*p) next = p+1; else next = NULL;
1055 if (sscanf (tok, "%"SCNi64, &r->lv_major) != 1) {
1056 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "lv_major");
1061 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_minor");
1064 p = strchrnul (tok, ',');
1065 if (*p) next = p+1; else next = NULL;
1067 if (sscanf (tok, "%"SCNi64, &r->lv_minor) != 1) {
1068 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "lv_minor");
1073 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_kernel_major");
1076 p = strchrnul (tok, ',');
1077 if (*p) next = p+1; else next = NULL;
1079 if (sscanf (tok, "%"SCNi64, &r->lv_kernel_major) != 1) {
1080 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "lv_kernel_major");
1085 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_kernel_minor");
1088 p = strchrnul (tok, ',');
1089 if (*p) next = p+1; else next = NULL;
1091 if (sscanf (tok, "%"SCNi64, &r->lv_kernel_minor) != 1) {
1092 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "lv_kernel_minor");
1097 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_size");
1100 p = strchrnul (tok, ',');
1101 if (*p) next = p+1; else next = NULL;
1103 if (sscanf (tok, "%"SCNu64, &r->lv_size) != 1) {
1104 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "lv_size");
1109 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "seg_count");
1112 p = strchrnul (tok, ',');
1113 if (*p) next = p+1; else next = NULL;
1115 if (sscanf (tok, "%"SCNi64, &r->seg_count) != 1) {
1116 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "seg_count");
1121 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "origin");
1124 p = strchrnul (tok, ',');
1125 if (*p) next = p+1; else next = NULL;
1127 r->origin = strdup (tok);
1128 if (r->origin == NULL) {
1134 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "snap_percent");
1137 p = strchrnul (tok, ',');
1138 if (*p) next = p+1; else next = NULL;
1141 r->snap_percent = -1;
1142 else if (sscanf (tok, "%f", &r->snap_percent) != 1) {
1143 fprintf (stderr, "%s: failed to parse float '%s' from token %s\n", __func__, tok, "snap_percent");
1148 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "copy_percent");
1151 p = strchrnul (tok, ',');
1152 if (*p) next = p+1; else next = NULL;
1155 r->copy_percent = -1;
1156 else if (sscanf (tok, "%f", &r->copy_percent) != 1) {
1157 fprintf (stderr, "%s: failed to parse float '%s' from token %s\n", __func__, tok, "copy_percent");
1162 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "move_pv");
1165 p = strchrnul (tok, ',');
1166 if (*p) next = p+1; else next = NULL;
1168 r->move_pv = strdup (tok);
1169 if (r->move_pv == NULL) {
1175 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_tags");
1178 p = strchrnul (tok, ',');
1179 if (*p) next = p+1; else next = NULL;
1181 r->lv_tags = strdup (tok);
1182 if (r->lv_tags == NULL) {
1188 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "mirror_log");
1191 p = strchrnul (tok, ',');
1192 if (*p) next = p+1; else next = NULL;
1194 r->mirror_log = strdup (tok);
1195 if (r->mirror_log == NULL) {
1201 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "modules");
1204 p = strchrnul (tok, ',');
1205 if (*p) next = p+1; else next = NULL;
1207 r->modules = strdup (tok);
1208 if (r->modules == NULL) {
1214 fprintf (stderr, "%s: failed: extra tokens at end of string\n", __func__);
1220 guestfs_lvm_int_lv_list *
1221 parse_command_line_lvs (void)
1226 guestfs_lvm_int_lv_list *ret;
1229 ret = malloc (sizeof *ret);
1231 reply_with_perror ("malloc");
1235 ret->guestfs_lvm_int_lv_list_len = 0;
1236 ret->guestfs_lvm_int_lv_list_val = NULL;
1238 r = command (&out, &err,
1240 "-o", lvm_lv_cols, "--unbuffered", "--noheadings",
1241 "--nosuffix", "--separator", ",", "--units", "b", NULL);
1243 reply_with_error ("%s", err);
1251 /* Tokenize each line of the output. */
1255 pend = strchr (p, '\n'); /* Get the next line of output. */
1261 while (*p && isspace (*p)) /* Skip any leading whitespace. */
1264 if (!*p) { /* Empty line? Skip it. */
1269 /* Allocate some space to store this next entry. */
1270 newp = realloc (ret->guestfs_lvm_int_lv_list_val,
1271 sizeof (guestfs_lvm_int_lv) * (i+1));
1273 reply_with_perror ("realloc");
1274 free (ret->guestfs_lvm_int_lv_list_val);
1279 ret->guestfs_lvm_int_lv_list_val = newp;
1281 /* Tokenize the next entry. */
1282 r = lvm_tokenize_lv (p, &ret->guestfs_lvm_int_lv_list_val[i]);
1284 reply_with_error ("failed to parse output of 'lvs' command");
1285 free (ret->guestfs_lvm_int_lv_list_val);
1295 ret->guestfs_lvm_int_lv_list_len = i;