static void mount_drive_letter (char drive_letter, const char *root) { char **drives; char *device; size_t i; /* Resolve the drive letter using the drive mappings table. */ drives = guestfs_inspect_get_drive_mappings (g, root); if (drives == NULL || drives[0] == NULL) { fprintf (stderr, _("%s: to use Windows drive letters, this must be a Windows guest\n"), program_name); exit (EXIT_FAILURE); } device = NULL; for (i = 0; drives[i] != NULL; i += 2) { if (c_tolower (drives[i][0]) == drive_letter && drives[i][1] == '\0') { device = drives[i+1]; break; } } if (device == NULL) { fprintf (stderr, _("%s: drive '%c:' not found.\n"), program_name, drive_letter); exit (EXIT_FAILURE); } /* Unmount current disk and remount device. */ if (guestfs_umount_all (g) == -1) exit (EXIT_FAILURE); if (guestfs_mount_options (g, "", device, "/") == -1) exit (EXIT_FAILURE); for (i = 0; drives[i] != NULL; ++i) free (drives[i]); free (drives); /* Don't need to free (device) because that string was in the * drives array. */ }
static void output_drive_mappings (xmlTextWriterPtr xo, char *root) { CLEANUP_FREE_STRING_LIST char **drive_mappings = NULL; char *str; size_t i; guestfs_push_error_handler (g, NULL, NULL); drive_mappings = guestfs_inspect_get_drive_mappings (g, root); guestfs_pop_error_handler (g); if (drive_mappings == NULL) return; if (drive_mappings[0] == NULL) return; /* Sort by key. */ qsort (drive_mappings, guestfs_int_count_strings (drive_mappings) / 2, 2 * sizeof (char *), compare_keys_nocase); XMLERROR (-1, xmlTextWriterStartElement (xo, BAD_CAST "drive_mappings")); for (i = 0; drive_mappings[i] != NULL; i += 2) { str = guestfs_canonical_device_name (g, drive_mappings[i+1]); if (!str) exit (EXIT_FAILURE); XMLERROR (-1, xmlTextWriterStartElement (xo, BAD_CAST "drive_mapping")); XMLERROR (-1, xmlTextWriterWriteAttribute (xo, BAD_CAST "name", BAD_CAST drive_mappings[i])); XMLERROR (-1, xmlTextWriterWriteString (xo, BAD_CAST str)); XMLERROR (-1, xmlTextWriterEndElement (xo)); free (str); } XMLERROR (-1, xmlTextWriterEndElement (xo)); }
static void mount_drive_letter (guestfs_h *g, char drive_letter, const char *root, int readonly) { char *device; size_t i; /* Resolve the drive letter using the drive mappings table. */ CLEANUP_FREE_STRING_LIST char **drives = guestfs_inspect_get_drive_mappings (g, root); if (drives == NULL || drives[0] == NULL) error (EXIT_FAILURE, 0, _("to use Windows drive letters, this must be a Windows guest")); device = NULL; for (i = 0; drives[i] != NULL; i += 2) { if (c_tolower (drives[i][0]) == drive_letter && drives[i][1] == '\0') { device = drives[i+1]; break; } } if (device == NULL) error (EXIT_FAILURE, 0, _("drive '%c:' not found."), drive_letter); /* Unmount current disk and remount device. */ if (guestfs_umount_all (g) == -1) exit (EXIT_FAILURE); if ((readonly ? guestfs_mount_ro : guestfs_mount) (g, device, "/") == -1) exit (EXIT_FAILURE); /* Don't need to free (device) because that string was in the * drives array. */ }