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 --- |