commands-win32.c (2ecfc0657afa5d29a373271b342f704a1a3c6737) commands-win32.c (54aa3de72ea2aaa2e903e7e879a4f3dda515a00e)
1/*
2 * QEMU Guest Agent win32-specific command implementations
3 *
4 * Copyright IBM Corp. 2012
5 *
6 * Authors:
7 * Michael Roth <mdroth@linux.vnet.ibm.com>
8 * Gal Hammer <ghammer@redhat.com>

--- 860 unchanged lines hidden (view full) ---

869}
870
871/* VSS provider works with volumes, thus there is no difference if
872 * the volume consist of spanned disks. Info about the first disk in the
873 * volume is returned for the spanned disk group (LVM) */
874static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
875{
876 Error *local_err = NULL;
1/*
2 * QEMU Guest Agent win32-specific command implementations
3 *
4 * Copyright IBM Corp. 2012
5 *
6 * Authors:
7 * Michael Roth <mdroth@linux.vnet.ibm.com>
8 * Gal Hammer <ghammer@redhat.com>

--- 860 unchanged lines hidden (view full) ---

869}
870
871/* VSS provider works with volumes, thus there is no difference if
872 * the volume consist of spanned disks. Info about the first disk in the
873 * volume is returned for the spanned disk group (LVM) */
874static GuestDiskAddressList *build_guest_disk_info(char *guid, Error **errp)
875{
876 Error *local_err = NULL;
877 GuestDiskAddressList *list = NULL, *cur_item = NULL;
877 GuestDiskAddressList *list = NULL;
878 GuestDiskAddress *disk = NULL;
879 int i;
880 HANDLE vol_h;
881 DWORD size;
882 PVOLUME_DISK_EXTENTS extents = NULL;
883
884 /* strip final backslash */
885 char *name = g_strdup(guid);

--- 35 unchanged lines hidden (view full) ---

921 disk->dev = g_strdup(name);
922 get_single_disk_info(0xffffffff, disk, &local_err);
923 if (local_err) {
924 g_debug("failed to get disk info, ignoring error: %s",
925 error_get_pretty(local_err));
926 error_free(local_err);
927 goto out;
928 }
878 GuestDiskAddress *disk = NULL;
879 int i;
880 HANDLE vol_h;
881 DWORD size;
882 PVOLUME_DISK_EXTENTS extents = NULL;
883
884 /* strip final backslash */
885 char *name = g_strdup(guid);

--- 35 unchanged lines hidden (view full) ---

921 disk->dev = g_strdup(name);
922 get_single_disk_info(0xffffffff, disk, &local_err);
923 if (local_err) {
924 g_debug("failed to get disk info, ignoring error: %s",
925 error_get_pretty(local_err));
926 error_free(local_err);
927 goto out;
928 }
929 list = g_malloc0(sizeof(*list));
930 list->value = disk;
929 QAPI_LIST_PREPEND(list, disk);
931 disk = NULL;
930 disk = NULL;
932 list->next = NULL;
933 goto out;
934 } else {
935 error_setg_win32(errp, GetLastError(),
936 "failed to get disk extents");
937 goto out;
938 }
939 }
940 g_debug("Number of extents: %lu", extents->NumberOfDiskExtents);

--- 14 unchanged lines hidden (view full) ---

955 disk->dev = g_strdup_printf("\\\\.\\PhysicalDrive%lu",
956 extents->Extents[i].DiskNumber);
957
958 get_single_disk_info(extents->Extents[i].DiskNumber, disk, &local_err);
959 if (local_err) {
960 error_propagate(errp, local_err);
961 goto out;
962 }
931 goto out;
932 } else {
933 error_setg_win32(errp, GetLastError(),
934 "failed to get disk extents");
935 goto out;
936 }
937 }
938 g_debug("Number of extents: %lu", extents->NumberOfDiskExtents);

--- 14 unchanged lines hidden (view full) ---

953 disk->dev = g_strdup_printf("\\\\.\\PhysicalDrive%lu",
954 extents->Extents[i].DiskNumber);
955
956 get_single_disk_info(extents->Extents[i].DiskNumber, disk, &local_err);
957 if (local_err) {
958 error_propagate(errp, local_err);
959 goto out;
960 }
963 cur_item = g_malloc0(sizeof(*list));
964 cur_item->value = disk;
961 QAPI_LIST_PREPEND(list, disk);
965 disk = NULL;
962 disk = NULL;
966 cur_item->next = list;
967 list = cur_item;
968 }
969
970
971out:
972 if (vol_h != INVALID_HANDLE_VALUE) {
973 CloseHandle(vol_h);
974 }
975 qapi_free_GuestDiskAddress(disk);
976 g_free(extents);
977 g_free(name);
978
979 return list;
980}
981
982GuestDiskInfoList *qmp_guest_get_disks(Error **errp)
983{
984 ERRP_GUARD();
963 }
964
965
966out:
967 if (vol_h != INVALID_HANDLE_VALUE) {
968 CloseHandle(vol_h);
969 }
970 qapi_free_GuestDiskAddress(disk);
971 g_free(extents);
972 g_free(name);
973
974 return list;
975}
976
977GuestDiskInfoList *qmp_guest_get_disks(Error **errp)
978{
979 ERRP_GUARD();
985 GuestDiskInfoList *new = NULL, *ret = NULL;
980 GuestDiskInfoList *ret = NULL;
986 HDEVINFO dev_info;
987 SP_DEVICE_INTERFACE_DATA dev_iface_data;
988 int i;
989
990 dev_info = SetupDiGetClassDevs(&GUID_DEVINTERFACE_DISK, 0, 0,
991 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
992 if (dev_info == INVALID_HANDLE_VALUE) {
993 error_setg_win32(errp, GetLastError(), "failed to get device tree");

--- 65 unchanged lines hidden (view full) ---

1059 error_free(local_err);
1060 qapi_free_GuestDiskAddress(address);
1061 address = NULL;
1062 } else {
1063 disk->address = address;
1064 disk->has_address = true;
1065 }
1066
981 HDEVINFO dev_info;
982 SP_DEVICE_INTERFACE_DATA dev_iface_data;
983 int i;
984
985 dev_info = SetupDiGetClassDevs(&GUID_DEVINTERFACE_DISK, 0, 0,
986 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
987 if (dev_info == INVALID_HANDLE_VALUE) {
988 error_setg_win32(errp, GetLastError(), "failed to get device tree");

--- 65 unchanged lines hidden (view full) ---

1054 error_free(local_err);
1055 qapi_free_GuestDiskAddress(address);
1056 address = NULL;
1057 } else {
1058 disk->address = address;
1059 disk->has_address = true;
1060 }
1061
1067 new = g_malloc0(sizeof(GuestDiskInfoList));
1068 new->value = disk;
1069 new->next = ret;
1070 ret = new;
1062 QAPI_LIST_PREPEND(ret, disk);
1071 }
1072
1073 SetupDiDestroyDeviceInfoList(dev_info);
1074 return ret;
1075}
1076
1077#else
1078

--- 81 unchanged lines hidden (view full) ---

1160 CloseHandle(hLocalDiskHandle);
1161 g_free(mnt_point);
1162 return fs;
1163}
1164
1165GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
1166{
1167 HANDLE vol_h;
1063 }
1064
1065 SetupDiDestroyDeviceInfoList(dev_info);
1066 return ret;
1067}
1068
1069#else
1070

--- 81 unchanged lines hidden (view full) ---

1152 CloseHandle(hLocalDiskHandle);
1153 g_free(mnt_point);
1154 return fs;
1155}
1156
1157GuestFilesystemInfoList *qmp_guest_get_fsinfo(Error **errp)
1158{
1159 HANDLE vol_h;
1168 GuestFilesystemInfoList *new, *ret = NULL;
1160 GuestFilesystemInfoList *ret = NULL;
1169 char guid[256];
1170
1171 vol_h = FindFirstVolume(guid, sizeof(guid));
1172 if (vol_h == INVALID_HANDLE_VALUE) {
1173 error_setg_win32(errp, GetLastError(), "failed to find any volume");
1174 return NULL;
1175 }
1176
1177 do {
1178 Error *local_err = NULL;
1179 GuestFilesystemInfo *info = build_guest_fsinfo(guid, &local_err);
1180 if (local_err) {
1181 g_debug("failed to get filesystem info, ignoring error: %s",
1182 error_get_pretty(local_err));
1183 error_free(local_err);
1184 continue;
1185 }
1161 char guid[256];
1162
1163 vol_h = FindFirstVolume(guid, sizeof(guid));
1164 if (vol_h == INVALID_HANDLE_VALUE) {
1165 error_setg_win32(errp, GetLastError(), "failed to find any volume");
1166 return NULL;
1167 }
1168
1169 do {
1170 Error *local_err = NULL;
1171 GuestFilesystemInfo *info = build_guest_fsinfo(guid, &local_err);
1172 if (local_err) {
1173 g_debug("failed to get filesystem info, ignoring error: %s",
1174 error_get_pretty(local_err));
1175 error_free(local_err);
1176 continue;
1177 }
1186 new = g_malloc(sizeof(*ret));
1187 new->value = info;
1188 new->next = ret;
1189 ret = new;
1178 QAPI_LIST_PREPEND(ret, info);
1190 } while (FindNextVolume(vol_h, guid, sizeof(guid)));
1191
1192 if (GetLastError() != ERROR_NO_MORE_FILES) {
1193 error_setg_win32(errp, GetLastError(), "failed to find next volume");
1194 }
1195
1196 FindVolumeClose(vol_h);
1197 return ret;

--- 127 unchanged lines hidden (view full) ---

1325 error_setg_win32(errp, GetLastError(), "failed to find any volume");
1326 return NULL;
1327 }
1328
1329 resp = g_new0(GuestFilesystemTrimResponse, 1);
1330
1331 do {
1332 GuestFilesystemTrimResult *res;
1179 } while (FindNextVolume(vol_h, guid, sizeof(guid)));
1180
1181 if (GetLastError() != ERROR_NO_MORE_FILES) {
1182 error_setg_win32(errp, GetLastError(), "failed to find next volume");
1183 }
1184
1185 FindVolumeClose(vol_h);
1186 return ret;

--- 127 unchanged lines hidden (view full) ---

1314 error_setg_win32(errp, GetLastError(), "failed to find any volume");
1315 return NULL;
1316 }
1317
1318 resp = g_new0(GuestFilesystemTrimResponse, 1);
1319
1320 do {
1321 GuestFilesystemTrimResult *res;
1333 GuestFilesystemTrimResultList *list;
1334 PWCHAR uc_path;
1335 DWORD char_count = 0;
1336 char *path, *out;
1337 GError *gerr = NULL;
1338 gchar * argv[4];
1339
1340 GetVolumePathNamesForVolumeNameW(guid, NULL, 0, &char_count);
1341

--- 22 unchanged lines hidden (view full) ---

1364 res->has_error = true;
1365 res->error = g_strdup(gerr->message);
1366 g_error_free(gerr);
1367 break;
1368 }
1369
1370 res->path = path;
1371
1322 PWCHAR uc_path;
1323 DWORD char_count = 0;
1324 char *path, *out;
1325 GError *gerr = NULL;
1326 gchar * argv[4];
1327
1328 GetVolumePathNamesForVolumeNameW(guid, NULL, 0, &char_count);
1329

--- 22 unchanged lines hidden (view full) ---

1352 res->has_error = true;
1353 res->error = g_strdup(gerr->message);
1354 g_error_free(gerr);
1355 break;
1356 }
1357
1358 res->path = path;
1359
1372 list = g_new0(GuestFilesystemTrimResultList, 1);
1373 list->value = res;
1374 list->next = resp->paths;
1360 QAPI_LIST_PREPEND(resp->paths, res);
1375
1361
1376 resp->paths = list;
1377
1378 memset(argv, 0, sizeof(argv));
1379 argv[0] = (gchar *)"defrag.exe";
1380 argv[1] = (gchar *)"/L";
1381 argv[2] = path;
1382
1383 if (!g_spawn_sync(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
1384 &out /* stdout */, NULL /* stdin */,
1385 NULL, &gerr)) {

--- 1175 unchanged lines hidden ---
1362 memset(argv, 0, sizeof(argv));
1363 argv[0] = (gchar *)"defrag.exe";
1364 argv[1] = (gchar *)"/L";
1365 argv[2] = path;
1366
1367 if (!g_spawn_sync(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
1368 &out /* stdout */, NULL /* stdin */,
1369 NULL, &gerr)) {

--- 1175 unchanged lines hidden ---