char add_drives (struct drv *drv, char next_drive) { int r; struct guestfs_add_drive_opts_argv ad_optargs; if (next_drive > 'z') { fprintf (stderr, _("%s: too many drives added on the command line\n"), program_name); exit (EXIT_FAILURE); } if (drv) { next_drive = add_drives (drv->next, next_drive); free (drv->device); drv->device = NULL; if (asprintf (&drv->device, "/dev/sd%c", next_drive) == -1) { perror ("asprintf"); exit (EXIT_FAILURE); } switch (drv->type) { case drv_a: ad_optargs.bitmask = 0; if (read_only) { ad_optargs.bitmask |= GUESTFS_ADD_DRIVE_OPTS_READONLY_BITMASK; ad_optargs.readonly = 1; } if (drv->a.format) { ad_optargs.bitmask |= GUESTFS_ADD_DRIVE_OPTS_FORMAT_BITMASK; ad_optargs.format = drv->a.format; } r = guestfs_add_drive_opts_argv (g, drv->a.filename, &ad_optargs); if (r == -1) exit (EXIT_FAILURE); drv->nr_drives = 1; next_drive++; break; case drv_uri: ad_optargs.bitmask = 0; if (read_only) { ad_optargs.bitmask |= GUESTFS_ADD_DRIVE_OPTS_READONLY_BITMASK; ad_optargs.readonly = 1; } if (drv->uri.format) { ad_optargs.bitmask |= GUESTFS_ADD_DRIVE_OPTS_FORMAT_BITMASK; ad_optargs.format = drv->uri.format; } ad_optargs.bitmask |= GUESTFS_ADD_DRIVE_OPTS_PROTOCOL_BITMASK; ad_optargs.protocol = drv->uri.protocol; if (drv->uri.server) { ad_optargs.bitmask |= GUESTFS_ADD_DRIVE_OPTS_SERVER_BITMASK; ad_optargs.server = drv->uri.server; } if (drv->uri.username) { ad_optargs.bitmask |= GUESTFS_ADD_DRIVE_OPTS_USERNAME_BITMASK; ad_optargs.username = drv->uri.username; } r = guestfs_add_drive_opts_argv (g, drv->uri.path, &ad_optargs); if (r == -1) exit (EXIT_FAILURE); drv->nr_drives = 1; next_drive++; break; case drv_d: r = add_libvirt_drives (drv->d.guest); if (r == -1) exit (EXIT_FAILURE); drv->nr_drives = r; next_drive += r; break; #if COMPILING_GUESTFISH case drv_N: /* -N option is not affected by --ro */ r = guestfs_add_drive_opts (g, drv->N.filename, GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", -1); if (r == -1) exit (EXIT_FAILURE); drv->nr_drives = 1; next_drive++; break; #endif default: /* keep GCC happy */ abort (); } } return next_drive; }
char add_drives (struct drv *drv, char next_drive) { int r; struct guestfs_add_drive_opts_argv ad_optargs; if (next_drive > 'z') { fprintf (stderr, _("%s: too many drives added on the command line\n"), program_name); exit (EXIT_FAILURE); } if (drv) { next_drive = add_drives (drv->next, next_drive); free (drv->device); drv->device = NULL; if (asprintf (&drv->device, "/dev/sd%c", next_drive) == -1) { perror ("asprintf"); exit (EXIT_FAILURE); } switch (drv->type) { case drv_a: ad_optargs.bitmask = 0; if (read_only) { ad_optargs.bitmask |= GUESTFS_ADD_DRIVE_OPTS_READONLY_BITMASK; ad_optargs.readonly = 1; } if (drv->a.format) { ad_optargs.bitmask |= GUESTFS_ADD_DRIVE_OPTS_FORMAT_BITMASK; ad_optargs.format = drv->a.format; } r = guestfs_add_drive_opts_argv (g, drv->a.filename, &ad_optargs); if (r == -1) exit (EXIT_FAILURE); drv->nr_drives = 1; next_drive++; break; case drv_d: r = add_libvirt_drives (drv->d.guest); if (r == -1) exit (EXIT_FAILURE); drv->nr_drives = r; next_drive += r; break; #if COMPILING_GUESTFISH case drv_N: /* guestfs_add_drive (ie. autodetecting) should be safe here * since we have just created the prepared disk. At the moment * it will always be "raw" but in a theoretical future we might * create other formats. */ /* -N option is not affected by --ro */ r = guestfs_add_drive (g, drv->N.filename); if (r == -1) exit (EXIT_FAILURE); drv->nr_drives = 1; next_drive++; break; #endif default: /* keep GCC happy */ abort (); } } return next_drive; }