comparison src/os/win32/ngx_files.c @ 183:4c698194c56d

nginx-0.0.1-2003-11-13-19:16:33 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 13 Nov 2003 16:16:33 +0000
parents 3c49eaf3f522
children 1bf718ce0dde
comparison
equal deleted inserted replaced
182:3c49eaf3f522 183:4c698194c56d
4 4
5 5
6 ssize_t ngx_read_file(ngx_file_t *file, char *buf, size_t size, off_t offset) 6 ssize_t ngx_read_file(ngx_file_t *file, char *buf, size_t size, off_t offset)
7 { 7 {
8 size_t n; 8 size_t n;
9 long high_offset;
10 ngx_err_t err;
11 OVERLAPPED ovlp, *povlp; 9 OVERLAPPED ovlp, *povlp;
12 10
11 #if (WIN9X)
12
13 if (ngx_win32_version < NGX_WIN_NT) { 13 if (ngx_win32_version < NGX_WIN_NT) {
14 high_offset = (long) (offset >> 32); 14 long high_offset;
15 if (SetFilePointer(file->fd, (long) offset, &high_offset, FILE_BEGIN) 15 ngx_err_t err;
16 == 0xFFFFFFFF) 16
17 { 17 /*
18 err = ngx_errno; 18 * in Win9X the overlapped pointer must be NULL
19 if (err != NO_ERROR) { 19 * so we need to use SetFilePointer() to set the offset
20 ngx_log_error(NGX_LOG_ERR, file->log, err, 20 */
21 "SeekFilePointer() failed"); 21
22 return NGX_ERROR; 22 if (file->offset != offset) {
23
24 /*
25 * the maximum file size on FAT16 is 2G, but on FAT32 it's 4G so we
26 * need to use high_offset because a single offset is signed value
27 */
28
29 high_offset = (long) (offset >> 32);
30 if (SetFilePointer(file->fd, (long) offset, &high_offset,
31 FILE_BEGIN) == INVALID_SET_FILE_POINTER)
32 {
33 /*
34 * INVALID_SET_FILE_POINTER is 0xffffffff and it can be valid
35 * value for large file so we need also to check GetLastError()
36 */
37
38 err = ngx_errno;
39 if (err != NO_ERROR) {
40 ngx_log_error(NGX_LOG_ERR, file->log, err,
41 "SeekFilePointer() failed");
42 return NGX_ERROR;
43 }
23 } 44 }
24 } 45 }
25 46
26 povlp = NULL; 47 povlp = NULL;
27 48
28 } else { 49 } else {
50
51 #endif
29 ovlp.Internal = 0; 52 ovlp.Internal = 0;
30 ovlp.InternalHigh = 0; 53 ovlp.InternalHigh = 0;
31 ovlp.Offset = (DWORD) offset; 54 ovlp.Offset = (DWORD) offset;
32 ovlp.OffsetHigh = (DWORD) (offset >> 32); 55 ovlp.OffsetHigh = (DWORD) (offset >> 32);
33 ovlp.hEvent = NULL; 56 ovlp.hEvent = NULL;
34 57
35 povlp = &ovlp; 58 povlp = &ovlp;
59
60 #if (WIN9X)
36 } 61 }
62 #endif
37 63
38 if (ReadFile(file->fd, buf, size, &n, povlp) == 0) { 64 if (ReadFile(file->fd, buf, size, &n, povlp) == 0) {
39 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, "ReadFile() failed"); 65 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, "ReadFile() failed");
40 return NGX_ERROR; 66 return NGX_ERROR;
41 } 67 }
44 70
45 return n; 71 return n;
46 } 72 }
47 73
48 74
49 /* TODO: as read file */
50
51 ssize_t ngx_write_file(ngx_file_t *file, char *buf, size_t size, off_t offset) 75 ssize_t ngx_write_file(ngx_file_t *file, char *buf, size_t size, off_t offset)
52 { 76 {
53 size_t n; 77 size_t n;
78 OVERLAPPED ovlp, *povlp;
54 79
55 if (WriteFile(file->fd, buf, size, &n, NULL) == 0) { 80 #if (WIN9X)
81
82 if (ngx_win32_version < NGX_WIN_NT) {
83 long high_offset;
84 ngx_err_t err;
85
86 /*
87 * in Win9X the overlapped pointer must be NULL
88 * so we need to use SetFilePointer() to set the offset
89 */
90
91 if (file->offset != offset) {
92
93 /*
94 * the maximum file size on FAT16 is 2G, but on FAT32 it's 4G so we
95 * need to use high_offset because a single offset is signed value
96 */
97
98 high_offset = (long) (offset >> 32);
99 if (SetFilePointer(file->fd, (long) offset, &high_offset,
100 FILE_BEGIN) == INVALID_SET_FILE_POINTER)
101 {
102 /*
103 * INVALID_SET_FILE_POINTER is 0xffffffff and it can be valid
104 * value for large file so we need also to check GetLastError()
105 */
106
107 err = ngx_errno;
108 if (err != NO_ERROR) {
109 ngx_log_error(NGX_LOG_ERR, file->log, err,
110 "SeekFilePointer() failed");
111 return NGX_ERROR;
112 }
113 }
114 }
115
116 povlp = NULL;
117
118 } else {
119
120 #endif
121
122 ovlp.Internal = 0;
123 ovlp.InternalHigh = 0;
124 ovlp.Offset = (DWORD) offset;
125 ovlp.OffsetHigh = (DWORD) (offset >> 32);
126 ovlp.hEvent = NULL;
127
128 povlp = &ovlp;
129
130 #if (WIN9X)
131 }
132 #endif
133
134 if (WriteFile(file->fd, buf, size, &n, povlp) == 0) {
56 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, "WriteFile() failed"); 135 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, "WriteFile() failed");
57 return NGX_ERROR; 136 return NGX_ERROR;
58 } 137 }
59 138
60 file->offset += n; 139 file->offset += n;
61 140
62 return n; 141 return n;
63 } 142 }
64 143
65 144
66 /* TODO: log error */
67
68 int ngx_file_append_mode(ngx_fd_t fd) 145 int ngx_file_append_mode(ngx_fd_t fd)
69 { 146 {
70 if (SetFilePointer(fd, 0, NULL, FILE_END) == 0xFFFFFFFF) { 147 ngx_err_t err;
71 if (GetLastError() != NO_ERROR) { 148
149 if (SetFilePointer(fd, 0, NULL, FILE_END) == INVALID_SET_FILE_POINTER) {
150 err = ngx_errno;
151 if (err != NO_ERROR) {
152 ngx_log_error(NGX_LOG_ERR, file->log, err,
153 "SeekFilePointer() failed");
72 return NGX_ERROR; 154 return NGX_ERROR;
73 } 155 }
74 } 156 }
75 157
76 return NGX_OK; 158 return NGX_OK;