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,13 +906,13 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags) | ||
906 | create_flags = OPEN_EXISTING; | 906 | create_flags = OPEN_EXISTING; |
907 | } | 907 | } |
908 | #ifdef QEMU_TOOL | 908 | #ifdef QEMU_TOOL |
909 | - overlapped = 0; | 909 | + overlapped = FILE_ATTRIBUTE_NORMAL; |
910 | #else | 910 | #else |
911 | overlapped = FILE_FLAG_OVERLAPPED; | 911 | overlapped = FILE_FLAG_OVERLAPPED; |
912 | #endif | 912 | #endif |
913 | s->hfile = CreateFile(filename, access_flags, | 913 | s->hfile = CreateFile(filename, access_flags, |
914 | FILE_SHARE_READ, NULL, | 914 | FILE_SHARE_READ, NULL, |
915 | - create_flags, overlapped, 0); | 915 | + create_flags, overlapped, NULL); |
916 | if (s->hfile == INVALID_HANDLE_VALUE) | 916 | if (s->hfile == INVALID_HANDLE_VALUE) |
917 | return -1; | 917 | return -1; |
918 | return 0; | 918 | return 0; |
@@ -962,6 +962,7 @@ static int raw_pwrite(BlockDriverState *bs, int64_t offset, | @@ -962,6 +962,7 @@ static int raw_pwrite(BlockDriverState *bs, int64_t offset, | ||
962 | return ret_count; | 962 | return ret_count; |
963 | } | 963 | } |
964 | 964 | ||
965 | +#if 0 | ||
965 | #ifndef QEMU_TOOL | 966 | #ifndef QEMU_TOOL |
966 | static void raw_aio_cb(void *opaque) | 967 | static void raw_aio_cb(void *opaque) |
967 | { | 968 | { |
@@ -1064,10 +1065,12 @@ static void raw_aio_cancel(BlockDriverAIOCB *blockacb) | @@ -1064,10 +1065,12 @@ static void raw_aio_cancel(BlockDriverAIOCB *blockacb) | ||
1064 | qemu_aio_release(acb); | 1065 | qemu_aio_release(acb); |
1065 | #endif | 1066 | #endif |
1066 | } | 1067 | } |
1068 | +#endif /* #if 0 */ | ||
1067 | 1069 | ||
1068 | static void raw_flush(BlockDriverState *bs) | 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 | static void raw_close(BlockDriverState *bs) | 1076 | static void raw_close(BlockDriverState *bs) |
@@ -1143,6 +1146,10 @@ void qemu_aio_flush(void) | @@ -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 | void qemu_aio_wait_start(void) | 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,13 +1261,13 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) | ||
1254 | create_flags = OPEN_EXISTING; | 1261 | create_flags = OPEN_EXISTING; |
1255 | 1262 | ||
1256 | #ifdef QEMU_TOOL | 1263 | #ifdef QEMU_TOOL |
1257 | - overlapped = 0; | 1264 | + overlapped = FILE_ATTRIBUTE_NORMAL; |
1258 | #else | 1265 | #else |
1259 | overlapped = FILE_FLAG_OVERLAPPED; | 1266 | overlapped = FILE_FLAG_OVERLAPPED; |
1260 | #endif | 1267 | #endif |
1261 | s->hfile = CreateFile(filename, access_flags, | 1268 | s->hfile = CreateFile(filename, access_flags, |
1262 | FILE_SHARE_READ, NULL, | 1269 | FILE_SHARE_READ, NULL, |
1263 | - create_flags, overlapped, 0); | 1270 | + create_flags, overlapped, NULL); |
1264 | if (s->hfile == INVALID_HANDLE_VALUE) | 1271 | if (s->hfile == INVALID_HANDLE_VALUE) |
1265 | return -1; | 1272 | return -1; |
1266 | return 0; | 1273 | return 0; |
block.c
@@ -56,12 +56,6 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, | @@ -56,12 +56,6 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num, | ||
56 | static BlockDriverState *bdrv_first; | 56 | static BlockDriverState *bdrv_first; |
57 | static BlockDriver *first_drv; | 57 | static BlockDriver *first_drv; |
58 | 58 | ||
59 | -#ifdef _WIN32 | ||
60 | -#define PATH_SEP '\\' | ||
61 | -#else | ||
62 | -#define PATH_SEP '/' | ||
63 | -#endif | ||
64 | - | ||
65 | int path_is_absolute(const char *path) | 59 | int path_is_absolute(const char *path) |
66 | { | 60 | { |
67 | const char *p; | 61 | const char *p; |
@@ -70,7 +64,11 @@ int path_is_absolute(const char *path) | @@ -70,7 +64,11 @@ int path_is_absolute(const char *path) | ||
70 | p++; | 64 | p++; |
71 | else | 65 | else |
72 | p = path; | 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 | /* if filename is absolute, just copy it to dest. Otherwise, build a | 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,7 +91,15 @@ void path_combine(char *dest, int dest_size, | ||
93 | p++; | 91 | p++; |
94 | else | 92 | else |
95 | p = base_path; | 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 | if (p1) | 103 | if (p1) |
98 | p1++; | 104 | p1++; |
99 | else | 105 | else |
@@ -168,7 +174,10 @@ int bdrv_create(BlockDriver *drv, | @@ -168,7 +174,10 @@ int bdrv_create(BlockDriver *drv, | ||
168 | #ifdef _WIN32 | 174 | #ifdef _WIN32 |
169 | void get_tmp_filename(char *filename, int size) | 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 | #else | 182 | #else |
174 | void get_tmp_filename(char *filename, int size) | 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,7 +1005,11 @@ char *get_human_readable_size(char *buf, int buf_size, int64_t size) | ||
996 | char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn) | 1005 | char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn) |
997 | { | 1006 | { |
998 | char buf1[128], date_buf[128], clock_buf[128]; | 1007 | char buf1[128], date_buf[128], clock_buf[128]; |
1008 | +#ifdef _WIN32 | ||
1009 | + struct tm *ptm; | ||
1010 | +#else | ||
999 | struct tm tm; | 1011 | struct tm tm; |
1012 | +#endif | ||
1000 | time_t ti; | 1013 | time_t ti; |
1001 | int64_t secs; | 1014 | int64_t secs; |
1002 | 1015 | ||
@@ -1006,11 +1019,15 @@ char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn) | @@ -1006,11 +1019,15 @@ char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn) | ||
1006 | "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK"); | 1019 | "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK"); |
1007 | } else { | 1020 | } else { |
1008 | ti = sn->date_sec; | 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 | localtime_r(&ti, &tm); | 1027 | localtime_r(&ti, &tm); |
1011 | -#endif | ||
1012 | strftime(date_buf, sizeof(date_buf), | 1028 | strftime(date_buf, sizeof(date_buf), |
1013 | "%Y-%m-%d %H:%M:%S", &tm); | 1029 | "%Y-%m-%d %H:%M:%S", &tm); |
1030 | +#endif | ||
1014 | secs = sn->vm_clock_nsec / 1000000000; | 1031 | secs = sn->vm_clock_nsec / 1000000000; |
1015 | snprintf(clock_buf, sizeof(clock_buf), | 1032 | snprintf(clock_buf, sizeof(clock_buf), |
1016 | "%02d:%02d:%02d.%03d", | 1033 | "%02d:%02d:%02d.%03d", |