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;