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 ("%s: daemon failed to decode procedure arguments", "mount");
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 ("%s: daemon failed to decode procedure arguments", "touch");
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 ("%s: daemon failed to decode procedure arguments", "cat");
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 ("%s: daemon failed to decode procedure arguments", "ll");
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 ("%s: daemon failed to decode procedure arguments", "ls");
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 ("%s: daemon failed to decode procedure arguments", "read_lines");
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 static void aug_init_stub (XDR *xdr_in)
324 struct guestfs_aug_init_args args;
328 memset (&args, 0, sizeof args);
330 if (!xdr_guestfs_aug_init_args (xdr_in, &args)) {
331 reply_with_error ("%s: daemon failed to decode procedure arguments", "aug_init");
337 r = do_aug_init (root, flags);
339 /* do_aug_init has already called reply_with_error, so just return */
345 static void aug_close_stub (XDR *xdr_in)
351 /* do_aug_close has already called reply_with_error, so just return */
357 static void aug_defvar_stub (XDR *xdr_in)
360 struct guestfs_aug_defvar_args args;
364 memset (&args, 0, sizeof args);
366 if (!xdr_guestfs_aug_defvar_args (xdr_in, &args)) {
367 reply_with_error ("%s: daemon failed to decode procedure arguments", "aug_defvar");
371 expr = args.expr ? *args.expr : NULL;
373 r = do_aug_defvar (name, expr);
375 /* do_aug_defvar has already called reply_with_error, so just return */
378 struct guestfs_aug_defvar_ret ret;
380 reply ((xdrproc_t) &xdr_guestfs_aug_defvar_ret, (char *) &ret);
383 static void aug_defnode_stub (XDR *xdr_in)
385 guestfs_aug_defnode_ret *r;
386 struct guestfs_aug_defnode_args args;
391 memset (&args, 0, sizeof args);
393 if (!xdr_guestfs_aug_defnode_args (xdr_in, &args)) {
394 reply_with_error ("%s: daemon failed to decode procedure arguments", "aug_defnode");
401 r = do_aug_defnode (name, expr, val);
403 /* do_aug_defnode has already called reply_with_error, so just return */
406 reply ((xdrproc_t) xdr_guestfs_aug_defnode_ret, (char *) r);
407 xdr_free ((xdrproc_t) xdr_guestfs_aug_defnode_ret, (char *) r);
410 static void aug_get_stub (XDR *xdr_in)
413 struct guestfs_aug_get_args args;
416 memset (&args, 0, sizeof args);
418 if (!xdr_guestfs_aug_get_args (xdr_in, &args)) {
419 reply_with_error ("%s: daemon failed to decode procedure arguments", "aug_get");
424 r = do_aug_get (path);
426 /* do_aug_get has already called reply_with_error, so just return */
429 struct guestfs_aug_get_ret ret;
431 reply ((xdrproc_t) &xdr_guestfs_aug_get_ret, (char *) &ret);
435 static void aug_set_stub (XDR *xdr_in)
438 struct guestfs_aug_set_args args;
442 memset (&args, 0, sizeof args);
444 if (!xdr_guestfs_aug_set_args (xdr_in, &args)) {
445 reply_with_error ("%s: daemon failed to decode procedure arguments", "aug_set");
451 r = do_aug_set (path, val);
453 /* do_aug_set has already called reply_with_error, so just return */
459 static void aug_insert_stub (XDR *xdr_in)
462 struct guestfs_aug_insert_args args;
467 memset (&args, 0, sizeof args);
469 if (!xdr_guestfs_aug_insert_args (xdr_in, &args)) {
470 reply_with_error ("%s: daemon failed to decode procedure arguments", "aug_insert");
475 before = args.before;
477 r = do_aug_insert (path, label, before);
479 /* do_aug_insert has already called reply_with_error, so just return */
485 static void aug_rm_stub (XDR *xdr_in)
488 struct guestfs_aug_rm_args args;
491 memset (&args, 0, sizeof args);
493 if (!xdr_guestfs_aug_rm_args (xdr_in, &args)) {
494 reply_with_error ("%s: daemon failed to decode procedure arguments", "aug_rm");
499 r = do_aug_rm (path);
501 /* do_aug_rm has already called reply_with_error, so just return */
504 struct guestfs_aug_rm_ret ret;
506 reply ((xdrproc_t) &xdr_guestfs_aug_rm_ret, (char *) &ret);
509 static void aug_mv_stub (XDR *xdr_in)
512 struct guestfs_aug_mv_args args;
516 memset (&args, 0, sizeof args);
518 if (!xdr_guestfs_aug_mv_args (xdr_in, &args)) {
519 reply_with_error ("%s: daemon failed to decode procedure arguments", "aug_mv");
525 r = do_aug_mv (src, dest);
527 /* do_aug_mv has already called reply_with_error, so just return */
533 static void aug_match_stub (XDR *xdr_in)
536 struct guestfs_aug_match_args args;
539 memset (&args, 0, sizeof args);
541 if (!xdr_guestfs_aug_match_args (xdr_in, &args)) {
542 reply_with_error ("%s: daemon failed to decode procedure arguments", "aug_match");
547 r = do_aug_match (path);
549 /* do_aug_match has already called reply_with_error, so just return */
552 struct guestfs_aug_match_ret ret;
553 ret.matches.matches_len = count_strings (r);
554 ret.matches.matches_val = r;
555 reply ((xdrproc_t) &xdr_guestfs_aug_match_ret, (char *) &ret);
559 static void aug_save_stub (XDR *xdr_in)
565 /* do_aug_save has already called reply_with_error, so just return */
571 static void aug_load_stub (XDR *xdr_in)
577 /* do_aug_load has already called reply_with_error, so just return */
583 static void aug_ls_stub (XDR *xdr_in)
586 struct guestfs_aug_ls_args args;
589 memset (&args, 0, sizeof args);
591 if (!xdr_guestfs_aug_ls_args (xdr_in, &args)) {
592 reply_with_error ("%s: daemon failed to decode procedure arguments", "aug_ls");
597 r = do_aug_ls (path);
599 /* do_aug_ls has already called reply_with_error, so just return */
602 struct guestfs_aug_ls_ret ret;
603 ret.matches.matches_len = count_strings (r);
604 ret.matches.matches_val = r;
605 reply ((xdrproc_t) &xdr_guestfs_aug_ls_ret, (char *) &ret);
609 static void rm_stub (XDR *xdr_in)
612 struct guestfs_rm_args args;
615 memset (&args, 0, sizeof args);
617 if (!xdr_guestfs_rm_args (xdr_in, &args)) {
618 reply_with_error ("%s: daemon failed to decode procedure arguments", "rm");
625 /* do_rm has already called reply_with_error, so just return */
631 static void rmdir_stub (XDR *xdr_in)
634 struct guestfs_rmdir_args args;
637 memset (&args, 0, sizeof args);
639 if (!xdr_guestfs_rmdir_args (xdr_in, &args)) {
640 reply_with_error ("%s: daemon failed to decode procedure arguments", "rmdir");
647 /* do_rmdir has already called reply_with_error, so just return */
653 static void rm_rf_stub (XDR *xdr_in)
656 struct guestfs_rm_rf_args args;
659 memset (&args, 0, sizeof args);
661 if (!xdr_guestfs_rm_rf_args (xdr_in, &args)) {
662 reply_with_error ("%s: daemon failed to decode procedure arguments", "rm_rf");
669 /* do_rm_rf has already called reply_with_error, so just return */
675 static void mkdir_stub (XDR *xdr_in)
678 struct guestfs_mkdir_args args;
681 memset (&args, 0, sizeof args);
683 if (!xdr_guestfs_mkdir_args (xdr_in, &args)) {
684 reply_with_error ("%s: daemon failed to decode procedure arguments", "mkdir");
691 /* do_mkdir has already called reply_with_error, so just return */
697 static void mkdir_p_stub (XDR *xdr_in)
700 struct guestfs_mkdir_p_args args;
703 memset (&args, 0, sizeof args);
705 if (!xdr_guestfs_mkdir_p_args (xdr_in, &args)) {
706 reply_with_error ("%s: daemon failed to decode procedure arguments", "mkdir_p");
711 r = do_mkdir_p (path);
713 /* do_mkdir_p has already called reply_with_error, so just return */
719 static void chmod_stub (XDR *xdr_in)
722 struct guestfs_chmod_args args;
726 memset (&args, 0, sizeof args);
728 if (!xdr_guestfs_chmod_args (xdr_in, &args)) {
729 reply_with_error ("%s: daemon failed to decode procedure arguments", "chmod");
735 r = do_chmod (mode, path);
737 /* do_chmod has already called reply_with_error, so just return */
743 static void chown_stub (XDR *xdr_in)
746 struct guestfs_chown_args args;
751 memset (&args, 0, sizeof args);
753 if (!xdr_guestfs_chown_args (xdr_in, &args)) {
754 reply_with_error ("%s: daemon failed to decode procedure arguments", "chown");
761 r = do_chown (owner, group, path);
763 /* do_chown has already called reply_with_error, so just return */
769 void dispatch_incoming_message (XDR *xdr_in)
772 case GUESTFS_PROC_MOUNT:
775 case GUESTFS_PROC_SYNC:
778 case GUESTFS_PROC_TOUCH:
781 case GUESTFS_PROC_CAT:
784 case GUESTFS_PROC_LL:
787 case GUESTFS_PROC_LS:
790 case GUESTFS_PROC_LIST_DEVICES:
791 list_devices_stub (xdr_in);
793 case GUESTFS_PROC_LIST_PARTITIONS:
794 list_partitions_stub (xdr_in);
796 case GUESTFS_PROC_PVS:
799 case GUESTFS_PROC_VGS:
802 case GUESTFS_PROC_LVS:
805 case GUESTFS_PROC_PVS_FULL:
806 pvs_full_stub (xdr_in);
808 case GUESTFS_PROC_VGS_FULL:
809 vgs_full_stub (xdr_in);
811 case GUESTFS_PROC_LVS_FULL:
812 lvs_full_stub (xdr_in);
814 case GUESTFS_PROC_READ_LINES:
815 read_lines_stub (xdr_in);
817 case GUESTFS_PROC_AUG_INIT:
818 aug_init_stub (xdr_in);
820 case GUESTFS_PROC_AUG_CLOSE:
821 aug_close_stub (xdr_in);
823 case GUESTFS_PROC_AUG_DEFVAR:
824 aug_defvar_stub (xdr_in);
826 case GUESTFS_PROC_AUG_DEFNODE:
827 aug_defnode_stub (xdr_in);
829 case GUESTFS_PROC_AUG_GET:
830 aug_get_stub (xdr_in);
832 case GUESTFS_PROC_AUG_SET:
833 aug_set_stub (xdr_in);
835 case GUESTFS_PROC_AUG_INSERT:
836 aug_insert_stub (xdr_in);
838 case GUESTFS_PROC_AUG_RM:
839 aug_rm_stub (xdr_in);
841 case GUESTFS_PROC_AUG_MV:
842 aug_mv_stub (xdr_in);
844 case GUESTFS_PROC_AUG_MATCH:
845 aug_match_stub (xdr_in);
847 case GUESTFS_PROC_AUG_SAVE:
848 aug_save_stub (xdr_in);
850 case GUESTFS_PROC_AUG_LOAD:
851 aug_load_stub (xdr_in);
853 case GUESTFS_PROC_AUG_LS:
854 aug_ls_stub (xdr_in);
856 case GUESTFS_PROC_RM:
859 case GUESTFS_PROC_RMDIR:
862 case GUESTFS_PROC_RM_RF:
865 case GUESTFS_PROC_MKDIR:
868 case GUESTFS_PROC_MKDIR_P:
869 mkdir_p_stub (xdr_in);
871 case GUESTFS_PROC_CHMOD:
874 case GUESTFS_PROC_CHOWN:
878 reply_with_error ("dispatch_incoming_message: unknown procedure number %d", proc_nr);
882 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";
884 static int lvm_tokenize_pv (char *str, struct guestfs_lvm_int_pv *r)
886 char *tok, *p, *next;
890 fprintf (stderr, "%s: failed: passed a NULL string\n", __func__);
893 if (!*str || isspace (*str)) {
894 fprintf (stderr, "%s: failed: passed a empty string or one beginning with whitespace\n", __func__);
899 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_name");
902 p = strchrnul (tok, ',');
903 if (*p) next = p+1; else next = NULL;
905 r->pv_name = strdup (tok);
906 if (r->pv_name == NULL) {
912 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_uuid");
915 p = strchrnul (tok, ',');
916 if (*p) next = p+1; else next = NULL;
918 for (i = j = 0; i < 32; ++j) {
919 if (tok[j] == '\0') {
920 fprintf (stderr, "%s: failed to parse UUID from '%s'\n", __func__, tok);
922 } else if (tok[j] != '-')
923 r->pv_uuid[i++] = tok[j];
927 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_fmt");
930 p = strchrnul (tok, ',');
931 if (*p) next = p+1; else next = NULL;
933 r->pv_fmt = strdup (tok);
934 if (r->pv_fmt == NULL) {
940 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_size");
943 p = strchrnul (tok, ',');
944 if (*p) next = p+1; else next = NULL;
946 if (sscanf (tok, "%"SCNu64, &r->pv_size) != 1) {
947 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "pv_size");
952 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "dev_size");
955 p = strchrnul (tok, ',');
956 if (*p) next = p+1; else next = NULL;
958 if (sscanf (tok, "%"SCNu64, &r->dev_size) != 1) {
959 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "dev_size");
964 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_free");
967 p = strchrnul (tok, ',');
968 if (*p) next = p+1; else next = NULL;
970 if (sscanf (tok, "%"SCNu64, &r->pv_free) != 1) {
971 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "pv_free");
976 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_used");
979 p = strchrnul (tok, ',');
980 if (*p) next = p+1; else next = NULL;
982 if (sscanf (tok, "%"SCNu64, &r->pv_used) != 1) {
983 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "pv_used");
988 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_attr");
991 p = strchrnul (tok, ',');
992 if (*p) next = p+1; else next = NULL;
994 r->pv_attr = strdup (tok);
995 if (r->pv_attr == NULL) {
1001 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_pe_count");
1004 p = strchrnul (tok, ',');
1005 if (*p) next = p+1; else next = NULL;
1007 if (sscanf (tok, "%"SCNi64, &r->pv_pe_count) != 1) {
1008 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "pv_pe_count");
1013 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_pe_alloc_count");
1016 p = strchrnul (tok, ',');
1017 if (*p) next = p+1; else next = NULL;
1019 if (sscanf (tok, "%"SCNi64, &r->pv_pe_alloc_count) != 1) {
1020 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "pv_pe_alloc_count");
1025 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_tags");
1028 p = strchrnul (tok, ',');
1029 if (*p) next = p+1; else next = NULL;
1031 r->pv_tags = strdup (tok);
1032 if (r->pv_tags == NULL) {
1038 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pe_start");
1041 p = strchrnul (tok, ',');
1042 if (*p) next = p+1; else next = NULL;
1044 if (sscanf (tok, "%"SCNu64, &r->pe_start) != 1) {
1045 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "pe_start");
1050 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_mda_count");
1053 p = strchrnul (tok, ',');
1054 if (*p) next = p+1; else next = NULL;
1056 if (sscanf (tok, "%"SCNi64, &r->pv_mda_count) != 1) {
1057 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "pv_mda_count");
1062 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_mda_free");
1065 p = strchrnul (tok, ',');
1066 if (*p) next = p+1; else next = NULL;
1068 if (sscanf (tok, "%"SCNu64, &r->pv_mda_free) != 1) {
1069 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "pv_mda_free");
1074 fprintf (stderr, "%s: failed: extra tokens at end of string\n", __func__);
1080 guestfs_lvm_int_pv_list *
1081 parse_command_line_pvs (void)
1086 guestfs_lvm_int_pv_list *ret;
1089 ret = malloc (sizeof *ret);
1091 reply_with_perror ("malloc");
1095 ret->guestfs_lvm_int_pv_list_len = 0;
1096 ret->guestfs_lvm_int_pv_list_val = NULL;
1098 r = command (&out, &err,
1100 "-o", lvm_pv_cols, "--unbuffered", "--noheadings",
1101 "--nosuffix", "--separator", ",", "--units", "b", NULL);
1103 reply_with_error ("%s", err);
1111 /* Tokenize each line of the output. */
1115 pend = strchr (p, '\n'); /* Get the next line of output. */
1121 while (*p && isspace (*p)) /* Skip any leading whitespace. */
1124 if (!*p) { /* Empty line? Skip it. */
1129 /* Allocate some space to store this next entry. */
1130 newp = realloc (ret->guestfs_lvm_int_pv_list_val,
1131 sizeof (guestfs_lvm_int_pv) * (i+1));
1133 reply_with_perror ("realloc");
1134 free (ret->guestfs_lvm_int_pv_list_val);
1139 ret->guestfs_lvm_int_pv_list_val = newp;
1141 /* Tokenize the next entry. */
1142 r = lvm_tokenize_pv (p, &ret->guestfs_lvm_int_pv_list_val[i]);
1144 reply_with_error ("failed to parse output of 'pvs' command");
1145 free (ret->guestfs_lvm_int_pv_list_val);
1155 ret->guestfs_lvm_int_pv_list_len = i;
1160 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";
1162 static int lvm_tokenize_vg (char *str, struct guestfs_lvm_int_vg *r)
1164 char *tok, *p, *next;
1168 fprintf (stderr, "%s: failed: passed a NULL string\n", __func__);
1171 if (!*str || isspace (*str)) {
1172 fprintf (stderr, "%s: failed: passed a empty string or one beginning with whitespace\n", __func__);
1177 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_name");
1180 p = strchrnul (tok, ',');
1181 if (*p) next = p+1; else next = NULL;
1183 r->vg_name = strdup (tok);
1184 if (r->vg_name == NULL) {
1190 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_uuid");
1193 p = strchrnul (tok, ',');
1194 if (*p) next = p+1; else next = NULL;
1196 for (i = j = 0; i < 32; ++j) {
1197 if (tok[j] == '\0') {
1198 fprintf (stderr, "%s: failed to parse UUID from '%s'\n", __func__, tok);
1200 } else if (tok[j] != '-')
1201 r->vg_uuid[i++] = tok[j];
1205 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_fmt");
1208 p = strchrnul (tok, ',');
1209 if (*p) next = p+1; else next = NULL;
1211 r->vg_fmt = strdup (tok);
1212 if (r->vg_fmt == NULL) {
1218 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_attr");
1221 p = strchrnul (tok, ',');
1222 if (*p) next = p+1; else next = NULL;
1224 r->vg_attr = strdup (tok);
1225 if (r->vg_attr == NULL) {
1231 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_size");
1234 p = strchrnul (tok, ',');
1235 if (*p) next = p+1; else next = NULL;
1237 if (sscanf (tok, "%"SCNu64, &r->vg_size) != 1) {
1238 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "vg_size");
1243 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_free");
1246 p = strchrnul (tok, ',');
1247 if (*p) next = p+1; else next = NULL;
1249 if (sscanf (tok, "%"SCNu64, &r->vg_free) != 1) {
1250 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "vg_free");
1255 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_sysid");
1258 p = strchrnul (tok, ',');
1259 if (*p) next = p+1; else next = NULL;
1261 r->vg_sysid = strdup (tok);
1262 if (r->vg_sysid == NULL) {
1268 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_extent_size");
1271 p = strchrnul (tok, ',');
1272 if (*p) next = p+1; else next = NULL;
1274 if (sscanf (tok, "%"SCNu64, &r->vg_extent_size) != 1) {
1275 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "vg_extent_size");
1280 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_extent_count");
1283 p = strchrnul (tok, ',');
1284 if (*p) next = p+1; else next = NULL;
1286 if (sscanf (tok, "%"SCNi64, &r->vg_extent_count) != 1) {
1287 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "vg_extent_count");
1292 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_free_count");
1295 p = strchrnul (tok, ',');
1296 if (*p) next = p+1; else next = NULL;
1298 if (sscanf (tok, "%"SCNi64, &r->vg_free_count) != 1) {
1299 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "vg_free_count");
1304 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "max_lv");
1307 p = strchrnul (tok, ',');
1308 if (*p) next = p+1; else next = NULL;
1310 if (sscanf (tok, "%"SCNi64, &r->max_lv) != 1) {
1311 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "max_lv");
1316 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "max_pv");
1319 p = strchrnul (tok, ',');
1320 if (*p) next = p+1; else next = NULL;
1322 if (sscanf (tok, "%"SCNi64, &r->max_pv) != 1) {
1323 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "max_pv");
1328 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "pv_count");
1331 p = strchrnul (tok, ',');
1332 if (*p) next = p+1; else next = NULL;
1334 if (sscanf (tok, "%"SCNi64, &r->pv_count) != 1) {
1335 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "pv_count");
1340 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_count");
1343 p = strchrnul (tok, ',');
1344 if (*p) next = p+1; else next = NULL;
1346 if (sscanf (tok, "%"SCNi64, &r->lv_count) != 1) {
1347 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "lv_count");
1352 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "snap_count");
1355 p = strchrnul (tok, ',');
1356 if (*p) next = p+1; else next = NULL;
1358 if (sscanf (tok, "%"SCNi64, &r->snap_count) != 1) {
1359 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "snap_count");
1364 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_seqno");
1367 p = strchrnul (tok, ',');
1368 if (*p) next = p+1; else next = NULL;
1370 if (sscanf (tok, "%"SCNi64, &r->vg_seqno) != 1) {
1371 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "vg_seqno");
1376 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_tags");
1379 p = strchrnul (tok, ',');
1380 if (*p) next = p+1; else next = NULL;
1382 r->vg_tags = strdup (tok);
1383 if (r->vg_tags == NULL) {
1389 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_mda_count");
1392 p = strchrnul (tok, ',');
1393 if (*p) next = p+1; else next = NULL;
1395 if (sscanf (tok, "%"SCNi64, &r->vg_mda_count) != 1) {
1396 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "vg_mda_count");
1401 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "vg_mda_free");
1404 p = strchrnul (tok, ',');
1405 if (*p) next = p+1; else next = NULL;
1407 if (sscanf (tok, "%"SCNu64, &r->vg_mda_free) != 1) {
1408 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "vg_mda_free");
1413 fprintf (stderr, "%s: failed: extra tokens at end of string\n", __func__);
1419 guestfs_lvm_int_vg_list *
1420 parse_command_line_vgs (void)
1425 guestfs_lvm_int_vg_list *ret;
1428 ret = malloc (sizeof *ret);
1430 reply_with_perror ("malloc");
1434 ret->guestfs_lvm_int_vg_list_len = 0;
1435 ret->guestfs_lvm_int_vg_list_val = NULL;
1437 r = command (&out, &err,
1439 "-o", lvm_vg_cols, "--unbuffered", "--noheadings",
1440 "--nosuffix", "--separator", ",", "--units", "b", NULL);
1442 reply_with_error ("%s", err);
1450 /* Tokenize each line of the output. */
1454 pend = strchr (p, '\n'); /* Get the next line of output. */
1460 while (*p && isspace (*p)) /* Skip any leading whitespace. */
1463 if (!*p) { /* Empty line? Skip it. */
1468 /* Allocate some space to store this next entry. */
1469 newp = realloc (ret->guestfs_lvm_int_vg_list_val,
1470 sizeof (guestfs_lvm_int_vg) * (i+1));
1472 reply_with_perror ("realloc");
1473 free (ret->guestfs_lvm_int_vg_list_val);
1478 ret->guestfs_lvm_int_vg_list_val = newp;
1480 /* Tokenize the next entry. */
1481 r = lvm_tokenize_vg (p, &ret->guestfs_lvm_int_vg_list_val[i]);
1483 reply_with_error ("failed to parse output of 'vgs' command");
1484 free (ret->guestfs_lvm_int_vg_list_val);
1494 ret->guestfs_lvm_int_vg_list_len = i;
1499 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";
1501 static int lvm_tokenize_lv (char *str, struct guestfs_lvm_int_lv *r)
1503 char *tok, *p, *next;
1507 fprintf (stderr, "%s: failed: passed a NULL string\n", __func__);
1510 if (!*str || isspace (*str)) {
1511 fprintf (stderr, "%s: failed: passed a empty string or one beginning with whitespace\n", __func__);
1516 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_name");
1519 p = strchrnul (tok, ',');
1520 if (*p) next = p+1; else next = NULL;
1522 r->lv_name = strdup (tok);
1523 if (r->lv_name == NULL) {
1529 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_uuid");
1532 p = strchrnul (tok, ',');
1533 if (*p) next = p+1; else next = NULL;
1535 for (i = j = 0; i < 32; ++j) {
1536 if (tok[j] == '\0') {
1537 fprintf (stderr, "%s: failed to parse UUID from '%s'\n", __func__, tok);
1539 } else if (tok[j] != '-')
1540 r->lv_uuid[i++] = tok[j];
1544 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_attr");
1547 p = strchrnul (tok, ',');
1548 if (*p) next = p+1; else next = NULL;
1550 r->lv_attr = strdup (tok);
1551 if (r->lv_attr == NULL) {
1557 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_major");
1560 p = strchrnul (tok, ',');
1561 if (*p) next = p+1; else next = NULL;
1563 if (sscanf (tok, "%"SCNi64, &r->lv_major) != 1) {
1564 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "lv_major");
1569 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_minor");
1572 p = strchrnul (tok, ',');
1573 if (*p) next = p+1; else next = NULL;
1575 if (sscanf (tok, "%"SCNi64, &r->lv_minor) != 1) {
1576 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "lv_minor");
1581 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_kernel_major");
1584 p = strchrnul (tok, ',');
1585 if (*p) next = p+1; else next = NULL;
1587 if (sscanf (tok, "%"SCNi64, &r->lv_kernel_major) != 1) {
1588 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "lv_kernel_major");
1593 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_kernel_minor");
1596 p = strchrnul (tok, ',');
1597 if (*p) next = p+1; else next = NULL;
1599 if (sscanf (tok, "%"SCNi64, &r->lv_kernel_minor) != 1) {
1600 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "lv_kernel_minor");
1605 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_size");
1608 p = strchrnul (tok, ',');
1609 if (*p) next = p+1; else next = NULL;
1611 if (sscanf (tok, "%"SCNu64, &r->lv_size) != 1) {
1612 fprintf (stderr, "%s: failed to parse size '%s' from token %s\n", __func__, tok, "lv_size");
1617 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "seg_count");
1620 p = strchrnul (tok, ',');
1621 if (*p) next = p+1; else next = NULL;
1623 if (sscanf (tok, "%"SCNi64, &r->seg_count) != 1) {
1624 fprintf (stderr, "%s: failed to parse int '%s' from token %s\n", __func__, tok, "seg_count");
1629 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "origin");
1632 p = strchrnul (tok, ',');
1633 if (*p) next = p+1; else next = NULL;
1635 r->origin = strdup (tok);
1636 if (r->origin == NULL) {
1642 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "snap_percent");
1645 p = strchrnul (tok, ',');
1646 if (*p) next = p+1; else next = NULL;
1649 r->snap_percent = -1;
1650 else if (sscanf (tok, "%f", &r->snap_percent) != 1) {
1651 fprintf (stderr, "%s: failed to parse float '%s' from token %s\n", __func__, tok, "snap_percent");
1656 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "copy_percent");
1659 p = strchrnul (tok, ',');
1660 if (*p) next = p+1; else next = NULL;
1663 r->copy_percent = -1;
1664 else if (sscanf (tok, "%f", &r->copy_percent) != 1) {
1665 fprintf (stderr, "%s: failed to parse float '%s' from token %s\n", __func__, tok, "copy_percent");
1670 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "move_pv");
1673 p = strchrnul (tok, ',');
1674 if (*p) next = p+1; else next = NULL;
1676 r->move_pv = strdup (tok);
1677 if (r->move_pv == NULL) {
1683 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "lv_tags");
1686 p = strchrnul (tok, ',');
1687 if (*p) next = p+1; else next = NULL;
1689 r->lv_tags = strdup (tok);
1690 if (r->lv_tags == NULL) {
1696 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "mirror_log");
1699 p = strchrnul (tok, ',');
1700 if (*p) next = p+1; else next = NULL;
1702 r->mirror_log = strdup (tok);
1703 if (r->mirror_log == NULL) {
1709 fprintf (stderr, "%s: failed: string finished early, around token %s\n", __func__, "modules");
1712 p = strchrnul (tok, ',');
1713 if (*p) next = p+1; else next = NULL;
1715 r->modules = strdup (tok);
1716 if (r->modules == NULL) {
1722 fprintf (stderr, "%s: failed: extra tokens at end of string\n", __func__);
1728 guestfs_lvm_int_lv_list *
1729 parse_command_line_lvs (void)
1734 guestfs_lvm_int_lv_list *ret;
1737 ret = malloc (sizeof *ret);
1739 reply_with_perror ("malloc");
1743 ret->guestfs_lvm_int_lv_list_len = 0;
1744 ret->guestfs_lvm_int_lv_list_val = NULL;
1746 r = command (&out, &err,
1748 "-o", lvm_lv_cols, "--unbuffered", "--noheadings",
1749 "--nosuffix", "--separator", ",", "--units", "b", NULL);
1751 reply_with_error ("%s", err);
1759 /* Tokenize each line of the output. */
1763 pend = strchr (p, '\n'); /* Get the next line of output. */
1769 while (*p && isspace (*p)) /* Skip any leading whitespace. */
1772 if (!*p) { /* Empty line? Skip it. */
1777 /* Allocate some space to store this next entry. */
1778 newp = realloc (ret->guestfs_lvm_int_lv_list_val,
1779 sizeof (guestfs_lvm_int_lv) * (i+1));
1781 reply_with_perror ("realloc");
1782 free (ret->guestfs_lvm_int_lv_list_val);
1787 ret->guestfs_lvm_int_lv_list_val = newp;
1789 /* Tokenize the next entry. */
1790 r = lvm_tokenize_lv (p, &ret->guestfs_lvm_int_lv_list_val[i]);
1792 reply_with_error ("failed to parse output of 'lvs' command");
1793 free (ret->guestfs_lvm_int_lv_list_val);
1803 ret->guestfs_lvm_int_lv_list_len = i;