qga: fix append file open modes for win32
For append file open modes, use FILE_APPEND_DATA for the desired access for writing at the end of the file. Version 2: For "a+", "ab+", and "a+b" modes use FILE_APPEND_DATA|GENERIC_READ. ORing in GENERIC_READ starts a read at the begining of the file. All writes will append to the end fo the file. Added white space to maintain the alignment of the guest_file_open_modes[]. Signed-off-by: Kirk Allan <kallan@suse.com> Cc: qemu-stable@nongnu.org * use FILE_GENERIC_APPEND macro, which provides same semantics as FILE_APPEND_DATA, but retains other flags from GENERIC_WRITE Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
parent
3c07587d49
commit
52074d0f66
|
@ -59,6 +59,7 @@ static struct {
|
||||||
.filehandles = QTAILQ_HEAD_INITIALIZER(guest_file_state.filehandles),
|
.filehandles = QTAILQ_HEAD_INITIALIZER(guest_file_state.filehandles),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define FILE_GENERIC_APPEND (FILE_GENERIC_WRITE & ~FILE_WRITE_DATA)
|
||||||
|
|
||||||
typedef struct OpenFlags {
|
typedef struct OpenFlags {
|
||||||
const char *forms;
|
const char *forms;
|
||||||
|
@ -66,20 +67,20 @@ typedef struct OpenFlags {
|
||||||
DWORD creation_disposition;
|
DWORD creation_disposition;
|
||||||
} OpenFlags;
|
} OpenFlags;
|
||||||
static OpenFlags guest_file_open_modes[] = {
|
static OpenFlags guest_file_open_modes[] = {
|
||||||
{"r", GENERIC_READ, OPEN_EXISTING},
|
{"r", GENERIC_READ, OPEN_EXISTING},
|
||||||
{"rb", GENERIC_READ, OPEN_EXISTING},
|
{"rb", GENERIC_READ, OPEN_EXISTING},
|
||||||
{"w", GENERIC_WRITE, CREATE_ALWAYS},
|
{"w", GENERIC_WRITE, CREATE_ALWAYS},
|
||||||
{"wb", GENERIC_WRITE, CREATE_ALWAYS},
|
{"wb", GENERIC_WRITE, CREATE_ALWAYS},
|
||||||
{"a", GENERIC_WRITE, OPEN_ALWAYS },
|
{"a", FILE_GENERIC_APPEND, OPEN_ALWAYS },
|
||||||
{"r+", GENERIC_WRITE|GENERIC_READ, OPEN_EXISTING},
|
{"r+", GENERIC_WRITE|GENERIC_READ, OPEN_EXISTING},
|
||||||
{"rb+", GENERIC_WRITE|GENERIC_READ, OPEN_EXISTING},
|
{"rb+", GENERIC_WRITE|GENERIC_READ, OPEN_EXISTING},
|
||||||
{"r+b", GENERIC_WRITE|GENERIC_READ, OPEN_EXISTING},
|
{"r+b", GENERIC_WRITE|GENERIC_READ, OPEN_EXISTING},
|
||||||
{"w+", GENERIC_WRITE|GENERIC_READ, CREATE_ALWAYS},
|
{"w+", GENERIC_WRITE|GENERIC_READ, CREATE_ALWAYS},
|
||||||
{"wb+", GENERIC_WRITE|GENERIC_READ, CREATE_ALWAYS},
|
{"wb+", GENERIC_WRITE|GENERIC_READ, CREATE_ALWAYS},
|
||||||
{"w+b", GENERIC_WRITE|GENERIC_READ, CREATE_ALWAYS},
|
{"w+b", GENERIC_WRITE|GENERIC_READ, CREATE_ALWAYS},
|
||||||
{"a+", GENERIC_WRITE|GENERIC_READ, OPEN_ALWAYS },
|
{"a+", FILE_GENERIC_APPEND|GENERIC_READ, OPEN_ALWAYS },
|
||||||
{"ab+", GENERIC_WRITE|GENERIC_READ, OPEN_ALWAYS },
|
{"ab+", FILE_GENERIC_APPEND|GENERIC_READ, OPEN_ALWAYS },
|
||||||
{"a+b", GENERIC_WRITE|GENERIC_READ, OPEN_ALWAYS }
|
{"a+b", FILE_GENERIC_APPEND|GENERIC_READ, OPEN_ALWAYS }
|
||||||
};
|
};
|
||||||
|
|
||||||
static OpenFlags *find_open_flag(const char *mode_str)
|
static OpenFlags *find_open_flag(const char *mode_str)
|
||||||
|
|
Loading…
Reference in a new issue