Commit 3b9f94e1a8757ac223a51c662e4278aab738f0cd
1 parent
f5e25d70
win32 block device fixes (initial patch by kazu)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2305 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
40 additions
and
16 deletions
block-raw.c
| ... | ... | @@ -906,13 +906,13 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) |
| 906 | 906 | create_flags = OPEN_EXISTING; |
| 907 | 907 | } |
| 908 | 908 | #ifdef QEMU_TOOL |
| 909 | - overlapped = 0; | |
| 909 | + overlapped = FILE_ATTRIBUTE_NORMAL; | |
| 910 | 910 | #else |
| 911 | 911 | overlapped = FILE_FLAG_OVERLAPPED; |
| 912 | 912 | #endif |
| 913 | 913 | s->hfile = CreateFile(filename, access_flags, |
| 914 | 914 | FILE_SHARE_READ, NULL, |
| 915 | - create_flags, overlapped, 0); | |
| 915 | + create_flags, overlapped, NULL); | |
| 916 | 916 | if (s->hfile == INVALID_HANDLE_VALUE) |
| 917 | 917 | return -1; |
| 918 | 918 | return 0; |
| ... | ... | @@ -962,6 +962,7 @@ static int raw_pwrite(BlockDriverState *bs, int64_t offset, |
| 962 | 962 | return ret_count; |
| 963 | 963 | } |
| 964 | 964 | |
| 965 | +#if 0 | |
| 965 | 966 | #ifndef QEMU_TOOL |
| 966 | 967 | static void raw_aio_cb(void *opaque) |
| 967 | 968 | { |
| ... | ... | @@ -1064,10 +1065,12 @@ static void raw_aio_cancel(BlockDriverAIOCB *blockacb) |
| 1064 | 1065 | qemu_aio_release(acb); |
| 1065 | 1066 | #endif |
| 1066 | 1067 | } |
| 1068 | +#endif /* #if 0 */ | |
| 1067 | 1069 | |
| 1068 | 1070 | static void raw_flush(BlockDriverState *bs) |
| 1069 | 1071 | { |
| 1070 | - /* XXX: add it */ | |
| 1072 | + BDRVRawState *s = bs->opaque; | |
| 1073 | + FlushFileBuffers(s->hfile); | |
| 1071 | 1074 | } |
| 1072 | 1075 | |
| 1073 | 1076 | static void raw_close(BlockDriverState *bs) |
| ... | ... | @@ -1143,6 +1146,10 @@ void qemu_aio_flush(void) |
| 1143 | 1146 | { |
| 1144 | 1147 | } |
| 1145 | 1148 | |
| 1149 | +void qemu_aio_flush(void) | |
| 1150 | +{ | |
| 1151 | +} | |
| 1152 | + | |
| 1146 | 1153 | void qemu_aio_wait_start(void) |
| 1147 | 1154 | { |
| 1148 | 1155 | } |
| ... | ... | @@ -1254,13 +1261,13 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) |
| 1254 | 1261 | create_flags = OPEN_EXISTING; |
| 1255 | 1262 | |
| 1256 | 1263 | #ifdef QEMU_TOOL |
| 1257 | - overlapped = 0; | |
| 1264 | + overlapped = FILE_ATTRIBUTE_NORMAL; | |
| 1258 | 1265 | #else |
| 1259 | 1266 | overlapped = FILE_FLAG_OVERLAPPED; |
| 1260 | 1267 | #endif |
| 1261 | 1268 | s->hfile = CreateFile(filename, access_flags, |
| 1262 | 1269 | FILE_SHARE_READ, NULL, |
| 1263 | - create_flags, overlapped, 0); | |
| 1270 | + create_flags, overlapped, NULL); | |
| 1264 | 1271 | if (s->hfile == INVALID_HANDLE_VALUE) |
| 1265 | 1272 | return -1; |
| 1266 | 1273 | return 0; | ... | ... |
block.c
| ... | ... | @@ -56,12 +56,6 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, |
| 56 | 56 | static BlockDriverState *bdrv_first; |
| 57 | 57 | static BlockDriver *first_drv; |
| 58 | 58 | |
| 59 | -#ifdef _WIN32 | |
| 60 | -#define PATH_SEP '\\' | |
| 61 | -#else | |
| 62 | -#define PATH_SEP '/' | |
| 63 | -#endif | |
| 64 | - | |
| 65 | 59 | int path_is_absolute(const char *path) |
| 66 | 60 | { |
| 67 | 61 | const char *p; |
| ... | ... | @@ -70,7 +64,11 @@ int path_is_absolute(const char *path) |
| 70 | 64 | p++; |
| 71 | 65 | else |
| 72 | 66 | p = path; |
| 73 | - return (*p == PATH_SEP); | |
| 67 | +#ifdef _WIN32 | |
| 68 | + return (*p == '/' || *p == '\\'); | |
| 69 | +#else | |
| 70 | + return (*p == '/'); | |
| 71 | +#endif | |
| 74 | 72 | } |
| 75 | 73 | |
| 76 | 74 | /* if filename is absolute, just copy it to dest. Otherwise, build a |
| ... | ... | @@ -93,7 +91,15 @@ void path_combine(char *dest, int dest_size, |
| 93 | 91 | p++; |
| 94 | 92 | else |
| 95 | 93 | p = base_path; |
| 96 | - p1 = strrchr(base_path, PATH_SEP); | |
| 94 | + p1 = strrchr(base_path, '/'); | |
| 95 | +#ifdef _WIN32 | |
| 96 | + { | |
| 97 | + const char *p2; | |
| 98 | + p2 = strrchr(base_path, '\\'); | |
| 99 | + if (!p1 || p2 > p1) | |
| 100 | + p1 = p2; | |
| 101 | + } | |
| 102 | +#endif | |
| 97 | 103 | if (p1) |
| 98 | 104 | p1++; |
| 99 | 105 | else |
| ... | ... | @@ -168,7 +174,10 @@ int bdrv_create(BlockDriver *drv, |
| 168 | 174 | #ifdef _WIN32 |
| 169 | 175 | void get_tmp_filename(char *filename, int size) |
| 170 | 176 | { |
| 171 | - tmpnam(filename); | |
| 177 | + char temp_dir[MAX_PATH]; | |
| 178 | + | |
| 179 | + GetTempPath(MAX_PATH, temp_dir); | |
| 180 | + GetTempFileName(temp_dir, "qem", 0, filename); | |
| 172 | 181 | } |
| 173 | 182 | #else |
| 174 | 183 | void get_tmp_filename(char *filename, int size) |
| ... | ... | @@ -996,7 +1005,11 @@ char *get_human_readable_size(char *buf, int buf_size, int64_t size) |
| 996 | 1005 | char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn) |
| 997 | 1006 | { |
| 998 | 1007 | char buf1[128], date_buf[128], clock_buf[128]; |
| 1008 | +#ifdef _WIN32 | |
| 1009 | + struct tm *ptm; | |
| 1010 | +#else | |
| 999 | 1011 | struct tm tm; |
| 1012 | +#endif | |
| 1000 | 1013 | time_t ti; |
| 1001 | 1014 | int64_t secs; |
| 1002 | 1015 | |
| ... | ... | @@ -1006,11 +1019,15 @@ char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn) |
| 1006 | 1019 | "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK"); |
| 1007 | 1020 | } else { |
| 1008 | 1021 | ti = sn->date_sec; |
| 1009 | -#ifndef _WIN32 | |
| 1022 | +#ifdef _WIN32 | |
| 1023 | + ptm = localtime(&ti); | |
| 1024 | + strftime(date_buf, sizeof(date_buf), | |
| 1025 | + "%Y-%m-%d %H:%M:%S", ptm); | |
| 1026 | +#else | |
| 1010 | 1027 | localtime_r(&ti, &tm); |
| 1011 | -#endif | |
| 1012 | 1028 | strftime(date_buf, sizeof(date_buf), |
| 1013 | 1029 | "%Y-%m-%d %H:%M:%S", &tm); |
| 1030 | +#endif | |
| 1014 | 1031 | secs = sn->vm_clock_nsec / 1000000000; |
| 1015 | 1032 | snprintf(clock_buf, sizeof(clock_buf), |
| 1016 | 1033 | "%02d:%02d:%02d.%03d", | ... | ... |