part_name = swm_base_name;
}
- part_fd = topen(part_name, O_WRONLY);
+ part_fd = topen(part_name, O_WRONLY | O_BINARY);
if (part_fd == INVALID_FILEDES) {
ERROR_WITH_ERRNO("Failed to open `%"TS"'", part_name);
ret = WIMLIB_ERR_OPEN;
extern off_t
filedes_offset(filedes_t fd);
+#ifndef __WIN32__
+# define O_BINARY 0
+#endif
+
#define INVALID_FILEDES (-1)
#endif /* _WIMLIB_UTIL_H */
{
int fd;
- fd = topen(filename, O_RDONLY);
+ fd = topen(filename, O_RDONLY | O_BINARY);
if (fd == INVALID_FILEDES) {
ERROR_WITH_ERRNO("Can't open \"%"TS"\" read-only", filename);
return WIMLIB_ERR_OPEN;
if (h == INVALID_HANDLE_VALUE)
goto err;
if (!FlushFileBuffers(h))
- goto err;
+ goto err_set_errno;
return 0;
-err:
+err_set_errno:
set_errno_from_GetLastError();
+err:
return -1;
}
wimlib_assert(count <= 0xffffffff);
h = (HANDLE)_get_osfhandle(fd);
- if (h == INVALID_HANDLE_VALUE) {
- errno = EBADF;
- return -1;
- }
+ if (h == INVALID_HANDLE_VALUE)
+ goto err;
/* Get original position */
relative_offset.QuadPart = 0;
if (!SetFilePointerEx(h, relative_offset, &orig_offset, FILE_CURRENT))
- goto err;
+ goto err_set_errno;
memset(&overlapped, 0, sizeof(overlapped));
overlapped.Offset = offset;
else
bret = ReadFile(h, buf, count, &bytes_read_or_written, &overlapped);
if (!bret)
- goto err;
+ goto err_set_errno;
/* Restore the original position */
if (!SetFilePointerEx(h, orig_offset, NULL, FILE_BEGIN))
- goto err;
+ goto err_set_errno;
return bytes_read_or_written;
-err:
+err_set_errno:
set_errno_from_GetLastError();
+err:
return -1;
}
static int
open_wim_writable(WIMStruct *w, const tchar *path, int open_flags)
{
- w->out_fd = topen(path, open_flags, 0644);
+ w->out_fd = topen(path, open_flags | O_BINARY, 0644);
if (w->out_fd == INVALID_FILEDES) {
ERROR_WITH_ERRNO("Failed to open `%"TS"' for writing", path);
return WIMLIB_ERR_OPEN;
DEBUG("Ended XML document");
- /* Call xmlFreeTextWriter() before ftello() because the former will
- * flush the file stream. */
- xmlFreeTextWriter(writer);
- writer = NULL;
-
end_offset = filedes_offset(out_fd);
if (end_offset == -1) {
ret = WIMLIB_ERR_WRITE;