comparison src/os/unix/ngx_files.c @ 0:f0b350454894 NGINX_0_1_0

nginx 0.1.0 *) The first public version.
author Igor Sysoev <http://sysoev.ru>
date Mon, 04 Oct 2004 00:00:00 +0400
parents
children 4b2dafa26fe2
comparison
equal deleted inserted replaced
-1:000000000000 0:f0b350454894
1
2 /*
3 * Copyright (C) Igor Sysoev
4 */
5
6
7 #include <ngx_config.h>
8 #include <ngx_core.h>
9
10
11 ssize_t ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)
12 {
13 ssize_t n;
14
15 ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,
16 "read: %d, %X, %d, " OFF_T_FMT, file->fd, buf, size, offset);
17
18 #if (HAVE_PREAD)
19
20 n = pread(file->fd, buf, size, offset);
21
22 if (n == -1) {
23 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
24 "pread() failed, file \"%s\"", file->name.data);
25 return NGX_ERROR;
26 }
27
28 #else
29
30 if (file->sys_offset != offset) {
31 if (lseek(file->fd, offset, SEEK_SET) == -1) {
32 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed");
33 return NGX_ERROR;
34 }
35
36 file->sys_offset = offset;
37 }
38
39 n = read(file->fd, buf, size);
40
41 if (n == -1) {
42 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "read() failed");
43 return NGX_ERROR;
44 }
45
46 file->sys_offset += n;
47
48 #endif
49
50 file->offset += n;
51
52 return n;
53 }
54
55
56 ssize_t ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)
57 {
58 ssize_t n;
59
60 #if (HAVE_PWRITE)
61
62 n = pwrite(file->fd, buf, size, offset);
63
64 if (n == -1) {
65 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "pwrite() failed");
66 return NGX_ERROR;
67 }
68
69 if ((size_t) n != size) {
70 ngx_log_error(NGX_LOG_CRIT, file->log, 0,
71 "pwrite() has written only %d of %d", n, size);
72 return NGX_ERROR;
73 }
74
75 #else
76
77 if (file->sys_offset != offset) {
78 if (lseek(file->fd, offset, SEEK_SET) == -1) {
79 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed");
80 return NGX_ERROR;
81 }
82
83 file->sys_offset = offset;
84 }
85
86 n = write(file->fd, buf, size);
87
88 if (n == -1) {
89 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "write() failed");
90 return NGX_ERROR;
91 }
92
93 if ((size_t) n != size) {
94 ngx_log_error(NGX_LOG_CRIT, file->log, 0,
95 "write() has written only %d of %d", n, size);
96 return NGX_ERROR;
97 }
98
99 file->sys_offset += n;
100
101 #endif
102
103 file->offset += n;
104
105 return n;
106 }
107
108
109 int ngx_open_tempfile(u_char *name, ngx_uint_t persistent)
110 {
111 ngx_fd_t fd;
112
113 fd = open((const char *) name, O_CREAT|O_EXCL|O_RDWR, 0600);
114
115 if (fd != -1 && !persistent) {
116 unlink((const char *) name);
117 }
118
119 return fd;
120 }
121
122
123 ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl,
124 off_t offset, ngx_pool_t *pool)
125 {
126 u_char *prev;
127 size_t size;
128 ssize_t n;
129 struct iovec *iov;
130 ngx_err_t err;
131 ngx_array_t io;
132
133 /* use pwrite() if there's the only buf in a chain */
134
135 if (cl->next == NULL) {
136 return ngx_write_file(file, cl->buf->pos,
137 (size_t) (cl->buf->last - cl->buf->pos),
138 offset);
139 }
140
141 prev = NULL;
142 iov = NULL;
143 size = 0;
144
145 ngx_init_array(io, pool, 10, sizeof(struct iovec), NGX_ERROR);
146
147 /* create the iovec and coalesce the neighbouring bufs */
148
149 while (cl) {
150 if (prev == cl->buf->pos) {
151 iov->iov_len += cl->buf->last - cl->buf->pos;
152
153 } else {
154 ngx_test_null(iov, ngx_push_array(&io), NGX_ERROR);
155 iov->iov_base = (void *) cl->buf->pos;
156 iov->iov_len = cl->buf->last - cl->buf->pos;
157 }
158
159 size += cl->buf->last - cl->buf->pos;
160 prev = cl->buf->last;
161 cl = cl->next;
162 }
163
164 /* use pwrite() if there's the only iovec buffer */
165
166 if (io.nelts == 1) {
167 iov = io.elts;
168 return ngx_write_file(file, (u_char *) iov[0].iov_base, iov[0].iov_len,
169 offset);
170 }
171
172 if (file->sys_offset != offset) {
173 if (lseek(file->fd, offset, SEEK_SET) == -1) {
174 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed");
175 return NGX_ERROR;
176 }
177
178 file->sys_offset = offset;
179 }
180
181 n = writev(file->fd, io.elts, io.nelts);
182
183 if (n == -1) {
184 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "writev() failed");
185 return NGX_ERROR;
186 }
187
188 if ((size_t) n != size) {
189 ngx_log_error(NGX_LOG_CRIT, file->log, 0,
190 "writev() has written only %d of %d", n, size);
191 return NGX_ERROR;
192 }
193
194 file->sys_offset += n;
195 file->offset += n;
196
197 return n;
198 }
199
200
201 int ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir)
202 {
203 dir->dir = opendir((const char *) name->data);
204
205 if (dir->dir == NULL) {
206 return NGX_ERROR;
207 }
208
209 dir->info_valid = 0;
210
211 return NGX_OK;
212 }
213
214
215 #if 0
216
217 ssize_t ngx_read_file(ngx_file_t *file, char *buf, size_t size, off_t offset)
218 {
219 if (!file->read->ready) {
220
221 ngx_memzero(&file->iocb, sizeof(iocb));
222 file->iocb.aio_fildes = file->fd;
223 file->iocb.aio_buf = buf;
224 file->iocb.aio_nbytes = size;
225 file->iocb.aio_offset = offset;
226 #if (USE_AIO_KQUEUE)
227 file->iocb.aio_sigevent.sigev_notify = SIGEV_KEVENT;
228 file->iocb.aio_sigevent.sigev_notify_kqueue = tid->kq;
229 file->iocb.aio_sigevent.sigev_value = (union sigval) file;
230 #endif
231 #if (USE_AIO_SIGNAL)
232 file->iocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
233 file->iocb.aio_sigevent.sigev_signo = NGX_SIGAIO;
234 #ifndef __FreeBSD__
235 file->iocb.aio_sigevent.sigev_value.sival_ptr = file;
236 #endif
237 #endif
238
239 if (aio_read(&file->iocb) == -1) {
240 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno,
241 "aio_read() failed");
242 return NGX_ERROR;
243
244 n = aio_error(&file->iocb);
245 if (n == EINPROGRESS)
246 return NGX_AGAIN;
247
248 if (n == -1) {
249 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno,
250 "aio_read() failed");
251 return NGX_ERROR;
252 }
253 }
254
255 ngx_assert(file->iocb.aio_buf == buf), return NGX_ERROR,
256 "ngx_aio_read_file: another buffer is passed");
257
258 n = aio_return(&file->iocb);
259 if (n == -1) {
260 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno,
261 "aio_read() failed");
262 return NGX_ERROR;
263 }
264
265 return n;
266 }
267
268 #endif