Mercurial > hg > nginx-quic
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; |