nginx-quic/src/os/win32/ngx_files.c

160 lines
3.9 KiB
C
Raw Normal View History

2002-09-02 10:48:24 -04:00
2002-12-27 04:27:47 -03:00
#include <ngx_config.h>
2002-09-02 10:48:24 -04:00
#include <ngx_core.h>
2003-06-03 11:42:58 -04:00
2002-09-02 10:48:24 -04:00
ssize_t ngx_read_file(ngx_file_t *file, char *buf, size_t size, off_t offset)
{
2003-11-13 03:14:05 -03:00
size_t n;
OVERLAPPED ovlp, *povlp;
2003-11-13 13:16:33 -03:00
#if (WIN9X)
2003-11-13 03:14:05 -03:00
if (ngx_win32_version < NGX_WIN_NT) {
2003-11-13 13:16:33 -03:00
long high_offset;
ngx_err_t err;
/*
* in Win9X the overlapped pointer must be NULL
* so we need to use SetFilePointer() to set the offset
*/
if (file->offset != offset) {
/*
* the maximum file size on FAT16 is 2G, but on FAT32 it's 4G so we
* need to use high_offset because a single offset is signed value
*/
high_offset = (long) (offset >> 32);
if (SetFilePointer(file->fd, (long) offset, &high_offset,
FILE_BEGIN) == INVALID_SET_FILE_POINTER)
{
/*
* INVALID_SET_FILE_POINTER is 0xffffffff and it can be valid
* value for large file so we need also to check GetLastError()
*/
err = ngx_errno;
if (err != NO_ERROR) {
ngx_log_error(NGX_LOG_ERR, file->log, err,
"SeekFilePointer() failed");
return NGX_ERROR;
}
2003-11-13 03:14:05 -03:00
}
}
2002-09-02 10:48:24 -04:00
2003-11-13 03:14:05 -03:00
povlp = NULL;
} else {
2003-11-13 13:16:33 -03:00
#endif
2003-11-13 03:14:05 -03:00
ovlp.Internal = 0;
ovlp.InternalHigh = 0;
ovlp.Offset = (DWORD) offset;
ovlp.OffsetHigh = (DWORD) (offset >> 32);
ovlp.hEvent = NULL;
povlp = &ovlp;
2003-11-13 13:16:33 -03:00
#if (WIN9X)
2003-11-13 03:14:05 -03:00
}
2003-11-13 13:16:33 -03:00
#endif
2003-11-13 03:14:05 -03:00
if (ReadFile(file->fd, buf, size, &n, povlp) == 0) {
2002-09-02 10:48:24 -04:00
ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, "ReadFile() failed");
return NGX_ERROR;
}
2002-12-21 14:14:50 -03:00
file->offset += n;
2002-09-02 10:48:24 -04:00
return n;
}
2003-06-03 11:42:58 -04:00
2003-11-13 03:14:05 -03:00
ssize_t ngx_write_file(ngx_file_t *file, char *buf, size_t size, off_t offset)
{
2003-11-13 13:16:33 -03:00
size_t n;
OVERLAPPED ovlp, *povlp;
#if (WIN9X)
if (ngx_win32_version < NGX_WIN_NT) {
long high_offset;
ngx_err_t err;
/*
* in Win9X the overlapped pointer must be NULL
* so we need to use SetFilePointer() to set the offset
*/
if (file->offset != offset) {
/*
* the maximum file size on FAT16 is 2G, but on FAT32 it's 4G so we
* need to use high_offset because a single offset is signed value
*/
high_offset = (long) (offset >> 32);
if (SetFilePointer(file->fd, (long) offset, &high_offset,
FILE_BEGIN) == INVALID_SET_FILE_POINTER)
{
/*
* INVALID_SET_FILE_POINTER is 0xffffffff and it can be valid
* value for large file so we need also to check GetLastError()
*/
err = ngx_errno;
if (err != NO_ERROR) {
ngx_log_error(NGX_LOG_ERR, file->log, err,
"SeekFilePointer() failed");
return NGX_ERROR;
}
}
}
povlp = NULL;
} else {
#endif
ovlp.Internal = 0;
ovlp.InternalHigh = 0;
ovlp.Offset = (DWORD) offset;
ovlp.OffsetHigh = (DWORD) (offset >> 32);
ovlp.hEvent = NULL;
povlp = &ovlp;
2003-11-13 03:14:05 -03:00
2003-11-13 13:16:33 -03:00
#if (WIN9X)
}
#endif
if (WriteFile(file->fd, buf, size, &n, povlp) == 0) {
2003-11-13 03:14:05 -03:00
ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, "WriteFile() failed");
return NGX_ERROR;
}
file->offset += n;
return n;
}
2003-07-23 16:01:29 -04:00
int ngx_file_append_mode(ngx_fd_t fd)
2003-06-03 11:42:58 -04:00
{
2003-11-13 13:16:33 -03:00
ngx_err_t err;
if (SetFilePointer(fd, 0, NULL, FILE_END) == INVALID_SET_FILE_POINTER) {
err = ngx_errno;
if (err != NO_ERROR) {
ngx_log_error(NGX_LOG_ERR, file->log, err,
"SeekFilePointer() failed");
2003-06-03 11:42:58 -04:00
return NGX_ERROR;
}
}
return NGX_OK;
}