Commit f45512feac6622615e08cca33d172abb87b01921
1 parent
6b21b973
win32 compilation fixes
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2134 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
23 additions
and
32 deletions
block-raw.c
| ... | ... | @@ -826,7 +826,7 @@ BlockDriver bdrv_host_device = { |
| 826 | 826 | typedef struct BDRVRawState { |
| 827 | 827 | HANDLE hfile; |
| 828 | 828 | int type; |
| 829 | - char drive_letter[2]; | |
| 829 | + char drive_path[16]; /* format: "d:\" */ | |
| 830 | 830 | } BDRVRawState; |
| 831 | 831 | |
| 832 | 832 | typedef struct RawAIOCB { |
| ... | ... | @@ -876,23 +876,8 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) |
| 876 | 876 | BDRVRawState *s = bs->opaque; |
| 877 | 877 | int access_flags, create_flags; |
| 878 | 878 | DWORD overlapped; |
| 879 | - char device_name[64]; | |
| 880 | - const char *p; | |
| 881 | 879 | |
| 882 | - if (strstart(filename, "/dev/cdrom", NULL)) { | |
| 883 | - if (find_cdrom(device_name, sizeof(device_name)) < 0) | |
| 884 | - return -ENOENT; | |
| 885 | - filename = device_name; | |
| 886 | - } else { | |
| 887 | - /* transform drive letters into device name */ | |
| 888 | - if (((filename[0] >= 'a' && filename[0] <= 'z') || | |
| 889 | - (filename[0] >= 'A' && filename[0] <= 'Z')) && | |
| 890 | - filename[1] == ':' && filename[2] == '\0') { | |
| 891 | - snprintf(device_name, sizeof(device_name), "\\\\.\\%c:", filename[0]); | |
| 892 | - filename = device_name; | |
| 893 | - } | |
| 894 | - } | |
| 895 | - s->type = find_device_type(filename); | |
| 880 | + s->type = FTYPE_FILE; | |
| 896 | 881 | |
| 897 | 882 | if ((flags & BDRV_O_ACCESS) == O_RDWR) { |
| 898 | 883 | access_flags = GENERIC_READ | GENERIC_WRITE; |
| ... | ... | @@ -1089,22 +1074,22 @@ static int raw_truncate(BlockDriverState *bs, int64_t offset) |
| 1089 | 1074 | return 0; |
| 1090 | 1075 | } |
| 1091 | 1076 | |
| 1092 | -static int64_t raw_getlength(BlockDriverState *bs) | |
| 1077 | +static int64_t raw_getlength(BlockDriverState *bs) | |
| 1093 | 1078 | { |
| 1094 | 1079 | BDRVRawState *s = bs->opaque; |
| 1095 | 1080 | LARGE_INTEGER l; |
| 1096 | 1081 | ULARGE_INTEGER available, total, total_free; |
| 1097 | 1082 | |
| 1098 | - switch(s->ftype) { | |
| 1083 | + switch(s->type) { | |
| 1099 | 1084 | case FTYPE_FILE: |
| 1100 | 1085 | l.LowPart = GetFileSize(s->hfile, &l.HighPart); |
| 1101 | 1086 | if (l.LowPart == 0xffffffffUL && GetLastError() != NO_ERROR) |
| 1102 | 1087 | return -EIO; |
| 1103 | 1088 | break; |
| 1104 | 1089 | case FTYPE_CD: |
| 1105 | - if (!GetDiskFreeSpaceEx(s->drive_letter, &available, &total, &total_free)) | |
| 1090 | + if (!GetDiskFreeSpaceEx(s->drive_path, &available, &total, &total_free)) | |
| 1106 | 1091 | return -EIO; |
| 1107 | - l = total; | |
| 1092 | + l.QuadPart = total.QuadPart; | |
| 1108 | 1093 | break; |
| 1109 | 1094 | default: |
| 1110 | 1095 | return -EIO; |
| ... | ... | @@ -1182,7 +1167,7 @@ static int find_cdrom(char *cdrom_name, int cdrom_name_size) |
| 1182 | 1167 | char drives[256], *pdrv = drives; |
| 1183 | 1168 | UINT type; |
| 1184 | 1169 | |
| 1185 | - memset(drives, 0, sizeof(drivers)); | |
| 1170 | + memset(drives, 0, sizeof(drives)); | |
| 1186 | 1171 | GetLogicalDriveStrings(sizeof(drives), drives); |
| 1187 | 1172 | while(pdrv[0] != '\0') { |
| 1188 | 1173 | type = GetDriveType(pdrv); |
| ... | ... | @@ -1197,16 +1182,16 @@ static int find_cdrom(char *cdrom_name, int cdrom_name_size) |
| 1197 | 1182 | return -1; |
| 1198 | 1183 | } |
| 1199 | 1184 | |
| 1200 | -static int find_device_type(const char *filename) | |
| 1185 | +static int find_device_type(BlockDriverState *bs, const char *filename) | |
| 1201 | 1186 | { |
| 1187 | + BDRVRawState *s = bs->opaque; | |
| 1202 | 1188 | UINT type; |
| 1203 | 1189 | const char *p; |
| 1204 | 1190 | |
| 1205 | 1191 | if (strstart(filename, "\\\\.\\", &p) || |
| 1206 | 1192 | strstart(filename, "//./", &p)) { |
| 1207 | - s->drive_letter[0] = p[0]; | |
| 1208 | - s->drive_letter[1] = '\0'; | |
| 1209 | - type = GetDriveType(s->drive_letter); | |
| 1193 | + snprintf(s->drive_path, sizeof(s->drive_path), "%c:\\", p[0]); | |
| 1194 | + type = GetDriveType(s->drive_path); | |
| 1210 | 1195 | if (type == DRIVE_CDROM) |
| 1211 | 1196 | return FTYPE_CD; |
| 1212 | 1197 | else |
| ... | ... | @@ -1222,7 +1207,6 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) |
| 1222 | 1207 | int access_flags, create_flags; |
| 1223 | 1208 | DWORD overlapped; |
| 1224 | 1209 | char device_name[64]; |
| 1225 | - const char *p; | |
| 1226 | 1210 | |
| 1227 | 1211 | if (strstart(filename, "/dev/cdrom", NULL)) { |
| 1228 | 1212 | if (find_cdrom(device_name, sizeof(device_name)) < 0) |
| ... | ... | @@ -1237,7 +1221,7 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) |
| 1237 | 1221 | filename = device_name; |
| 1238 | 1222 | } |
| 1239 | 1223 | } |
| 1240 | - s->type = find_device_type(filename); | |
| 1224 | + s->type = find_device_type(bs, filename); | |
| 1241 | 1225 | |
| 1242 | 1226 | if ((flags & BDRV_O_ACCESS) == O_RDWR) { |
| 1243 | 1227 | access_flags = GENERIC_READ | GENERIC_WRITE; | ... | ... |
block.c
| ... | ... | @@ -182,11 +182,17 @@ void get_tmp_filename(char *filename, int size) |
| 182 | 182 | #endif |
| 183 | 183 | |
| 184 | 184 | #ifdef _WIN32 |
| 185 | +static int is_windows_drive_prefix(const char *filename) | |
| 186 | +{ | |
| 187 | + return (((filename[0] >= 'a' && filename[0] <= 'z') || | |
| 188 | + (filename[0] >= 'A' && filename[0] <= 'Z')) && | |
| 189 | + filename[1] == ':'); | |
| 190 | +} | |
| 191 | + | |
| 185 | 192 | static int is_windows_drive(const char *filename) |
| 186 | 193 | { |
| 187 | - if (((filename[0] >= 'a' && filename[0] <= 'z') || | |
| 188 | - (filename[0] >= 'A' && filename[0] <= 'Z')) && | |
| 189 | - filename[1] == ':' && filename[2] == '\0') | |
| 194 | + if (is_windows_drive_prefix(filename) && | |
| 195 | + filename[2] == '\0') | |
| 190 | 196 | return 1; |
| 191 | 197 | if (strstart(filename, "\\\\.\\", NULL) || |
| 192 | 198 | strstart(filename, "//./", NULL)) |
| ... | ... | @@ -203,7 +209,8 @@ static BlockDriver *find_protocol(const char *filename) |
| 203 | 209 | const char *p; |
| 204 | 210 | |
| 205 | 211 | #ifdef _WIN32 |
| 206 | - if (is_windows_drive(filename)) | |
| 212 | + if (is_windows_drive(filename) || | |
| 213 | + is_windows_drive_prefix(filename)) | |
| 207 | 214 | return &bdrv_raw; |
| 208 | 215 | #endif |
| 209 | 216 | p = strchr(filename, ':'); | ... | ... |