Mercurial > hg > nginx
comparison src/os/win32/ngx_files.c @ 184:1bf718ce0dde
nginx-0.0.1-2003-11-14-10:20:34 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 14 Nov 2003 07:20:34 +0000 |
parents | 4c698194c56d |
children | d5f50cefc322 |
comparison
equal
deleted
inserted
replaced
183:4c698194c56d | 184:1bf718ce0dde |
---|---|
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; | |
9 OVERLAPPED ovlp, *povlp; | 11 OVERLAPPED ovlp, *povlp; |
10 | 12 |
11 #if (WIN9X) | |
12 | |
13 if (ngx_win32_version < NGX_WIN_NT) { | 13 if (ngx_win32_version < NGX_WIN_NT) { |
14 long high_offset; | |
15 ngx_err_t err; | |
16 | 14 |
17 /* | 15 /* |
18 * in Win9X the overlapped pointer must be NULL | 16 * in Win9X the overlapped pointer must be NULL |
19 * so we need to use SetFilePointer() to set the offset | 17 * so we need to use SetFilePointer() to set the offset |
20 */ | 18 */ |
45 } | 43 } |
46 | 44 |
47 povlp = NULL; | 45 povlp = NULL; |
48 | 46 |
49 } else { | 47 } else { |
50 | |
51 #endif | |
52 ovlp.Internal = 0; | 48 ovlp.Internal = 0; |
53 ovlp.InternalHigh = 0; | 49 ovlp.InternalHigh = 0; |
54 ovlp.Offset = (DWORD) offset; | 50 ovlp.Offset = (DWORD) offset; |
55 ovlp.OffsetHigh = (DWORD) (offset >> 32); | 51 ovlp.OffsetHigh = (DWORD) (offset >> 32); |
56 ovlp.hEvent = NULL; | 52 ovlp.hEvent = NULL; |
57 | 53 |
58 povlp = &ovlp; | 54 povlp = &ovlp; |
59 | 55 } |
60 #if (WIN9X) | |
61 } | |
62 #endif | |
63 | 56 |
64 if (ReadFile(file->fd, buf, size, &n, povlp) == 0) { | 57 if (ReadFile(file->fd, buf, size, &n, povlp) == 0) { |
65 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, "ReadFile() failed"); | 58 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, "ReadFile() failed"); |
66 return NGX_ERROR; | 59 return NGX_ERROR; |
67 } | 60 } |
73 | 66 |
74 | 67 |
75 ssize_t ngx_write_file(ngx_file_t *file, char *buf, size_t size, off_t offset) | 68 ssize_t ngx_write_file(ngx_file_t *file, char *buf, size_t size, off_t offset) |
76 { | 69 { |
77 size_t n; | 70 size_t n; |
71 long high_offset; | |
72 ngx_err_t err; | |
78 OVERLAPPED ovlp, *povlp; | 73 OVERLAPPED ovlp, *povlp; |
79 | 74 |
80 #if (WIN9X) | |
81 | |
82 if (ngx_win32_version < NGX_WIN_NT) { | 75 if (ngx_win32_version < NGX_WIN_NT) { |
83 long high_offset; | |
84 ngx_err_t err; | |
85 | 76 |
86 /* | 77 /* |
87 * in Win9X the overlapped pointer must be NULL | 78 * in Win9X the overlapped pointer must be NULL |
88 * so we need to use SetFilePointer() to set the offset | 79 * so we need to use SetFilePointer() to set the offset |
89 */ | 80 */ |
114 } | 105 } |
115 | 106 |
116 povlp = NULL; | 107 povlp = NULL; |
117 | 108 |
118 } else { | 109 } else { |
119 | |
120 #endif | |
121 | |
122 ovlp.Internal = 0; | 110 ovlp.Internal = 0; |
123 ovlp.InternalHigh = 0; | 111 ovlp.InternalHigh = 0; |
124 ovlp.Offset = (DWORD) offset; | 112 ovlp.Offset = (DWORD) offset; |
125 ovlp.OffsetHigh = (DWORD) (offset >> 32); | 113 ovlp.OffsetHigh = (DWORD) (offset >> 32); |
126 ovlp.hEvent = NULL; | 114 ovlp.hEvent = NULL; |
127 | 115 |
128 povlp = &ovlp; | 116 povlp = &ovlp; |
129 | 117 } |
130 #if (WIN9X) | |
131 } | |
132 #endif | |
133 | 118 |
134 if (WriteFile(file->fd, buf, size, &n, povlp) == 0) { | 119 if (WriteFile(file->fd, buf, size, &n, povlp) == 0) { |
135 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, "WriteFile() failed"); | 120 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, "WriteFile() failed"); |
136 return NGX_ERROR; | 121 return NGX_ERROR; |
137 } | 122 } |
140 | 125 |
141 return n; | 126 return n; |
142 } | 127 } |
143 | 128 |
144 | 129 |
130 ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, | |
131 off_t offset, ngx_pool_t *pool) | |
132 { | |
133 char *buf, *prev; | |
134 size_t size; | |
135 ssize_t total, n; | |
136 | |
137 total = 0; | |
138 | |
139 while (cl) { | |
140 buf = cl->hunk->pos; | |
141 prev = buf; | |
142 size = 0; | |
143 | |
144 /* coalesce the neighbouring hunks */ | |
145 | |
146 while (cl && prev == cl->hunk->pos) { | |
147 size += cl->hunk->last - cl->hunk->pos; | |
148 prev = cl->hunk->last; | |
149 cl = cl->next; | |
150 } | |
151 | |
152 n = ngx_write_file(file, buf, size, offset); | |
153 | |
154 if (n == NGX_ERROR) { | |
155 return NGX_ERROR; | |
156 } | |
157 | |
158 total += n; | |
159 offset += n; | |
160 } | |
161 | |
162 return total; | |
163 } | |
164 | |
165 | |
166 int ngx_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_pool_t *pool) | |
167 { | |
168 int rc, collision; | |
169 u_int num; | |
170 char *name; | |
171 ngx_err_t err; | |
172 | |
173 name = ngx_palloc(pool, to->len + 1 + 10 + 1 + sizeof("DELETE")); | |
174 ngx_memcpy(name, to->data, to->len); | |
175 | |
176 collision = 0; | |
177 | |
178 /* mutex_lock() (per cache or single ?) */ | |
179 | |
180 do { | |
181 num = ngx_next_temp_number(collision); | |
182 | |
183 ngx_snprintf(name + to->len, 1 + 10 + 1 + sizeof("DELETE"), | |
184 ".%010u.DELETE", num); | |
185 | |
186 if (MoveFile(to->data, name) == 0) { | |
187 err = ngx_errno; | |
188 if (err == NGX_ENOENT || err == NGX_ENOTDIR) { | |
189 return NGX_ERROR; | |
190 } | |
191 | |
192 collision = 1; | |
193 ngx_log_error(NGX_LOG_ERR, pool->log, ngx_errno, | |
194 "MoveFile() failed"); | |
195 } | |
196 | |
197 } while (collision); | |
198 | |
199 if (ngx_win32_version >= NGX_WIN_NT) { | |
200 if (DeleteFile(name) == 0) { | |
201 ngx_log_error(NGX_LOG_ERR, pool->log, ngx_errno, | |
202 "DeleteFile() failed"); | |
203 } | |
204 } | |
205 | |
206 if (MoveFile(from->data, to->data) == 0) { | |
207 rc = NGX_ERROR; | |
208 | |
209 } else { | |
210 rc = NGX_OK; | |
211 } | |
212 | |
213 if (rc == NGX_ERROR) { | |
214 ngx_log_error(NGX_LOG_ERR, pool->log, ngx_errno, "MoveFile() failed"); | |
215 } | |
216 | |
217 /* mutex_unlock() */ | |
218 | |
219 return rc; | |
220 } | |
221 | |
222 | |
145 int ngx_file_append_mode(ngx_fd_t fd) | 223 int ngx_file_append_mode(ngx_fd_t fd) |
146 { | 224 { |
147 ngx_err_t err; | |
148 | |
149 if (SetFilePointer(fd, 0, NULL, FILE_END) == INVALID_SET_FILE_POINTER) { | 225 if (SetFilePointer(fd, 0, NULL, FILE_END) == INVALID_SET_FILE_POINTER) { |
150 err = ngx_errno; | 226 if (ngx_errno != NO_ERROR) { |
151 if (err != NO_ERROR) { | |
152 ngx_log_error(NGX_LOG_ERR, file->log, err, | |
153 "SeekFilePointer() failed"); | |
154 return NGX_ERROR; | 227 return NGX_ERROR; |
155 } | 228 } |
156 } | 229 } |
157 | 230 |
158 return NGX_OK; | 231 return NGX_OK; |