3 * Copyright (C) Igor Sysoev
7 #include <ngx_config.h>
12 ngx_read_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)
16 ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,
17 "read: %d, %p, %uz, %O", file->fd, buf, size, offset);
21 n = pread(file->fd, buf, size, offset);
24 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
25 "pread() failed, file \"%s\"", file->name.data);
31 if (file->sys_offset != offset) {
32 if (lseek(file->fd, offset, SEEK_SET) == -1) {
33 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed");
37 file->sys_offset = offset;
40 n = read(file->fd, buf, size);
43 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "read() failed");
47 file->sys_offset += n;
58 ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset)
62 ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0,
63 "write: %d, %p, %uz, %O", file->fd, buf, size, offset);
67 n = pwrite(file->fd, buf, size, offset);
70 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "pwrite() failed");
74 if ((size_t) n != size) {
75 ngx_log_error(NGX_LOG_CRIT, file->log, 0,
76 "pwrite() has written only %z of %uz", n, size);
82 if (file->sys_offset != offset) {
83 if (lseek(file->fd, offset, SEEK_SET) == -1) {
84 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed");
88 file->sys_offset = offset;
91 n = write(file->fd, buf, size);
94 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "write() failed");
98 if ((size_t) n != size) {
99 ngx_log_error(NGX_LOG_CRIT, file->log, 0,
100 "write() has written only %z of %uz", n, size);
104 file->sys_offset += n;
115 ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access)
119 fd = open((const char *) name, O_CREAT|O_EXCL|O_RDWR,
120 access ? access : 0600);
122 if (fd != -1 && !persistent) {
123 unlink((const char *) name);
133 ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,
140 struct iovec *iov, iovs[NGX_IOVS];
142 /* use pwrite() if there is the only buf in a chain */
144 if (cl->next == NULL) {
145 return ngx_write_file(file, cl->buf->pos,
146 (size_t) (cl->buf->last - cl->buf->pos),
151 vec.size = sizeof(struct iovec);
152 vec.nalloc = NGX_IOVS;
162 /* create the iovec and coalesce the neighbouring bufs */
164 while (cl && vec.nelts < IOV_MAX) {
165 if (prev == cl->buf->pos) {
166 iov->iov_len += cl->buf->last - cl->buf->pos;
169 iov = ngx_array_push(&vec);
174 iov->iov_base = (void *) cl->buf->pos;
175 iov->iov_len = cl->buf->last - cl->buf->pos;
178 size += cl->buf->last - cl->buf->pos;
179 prev = cl->buf->last;
183 /* use pwrite() if there is the only iovec buffer */
185 if (vec.nelts == 1) {
187 return ngx_write_file(file, (u_char *) iov[0].iov_base,
188 iov[0].iov_len, offset);
191 if (file->sys_offset != offset) {
192 if (lseek(file->fd, offset, SEEK_SET) == -1) {
193 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
198 file->sys_offset = offset;
201 n = writev(file->fd, vec.elts, vec.nelts);
204 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno,
209 if ((size_t) n != size) {
210 ngx_log_error(NGX_LOG_CRIT, file->log, 0,
211 "writev() has written only %z of %uz", n, size);
215 file->sys_offset += n;
225 ngx_set_file_time(u_char *name, ngx_fd_t fd, time_t s)
227 struct timeval tv[2];
234 if (utimes((char *) name, tv) != -1) {
243 ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir)
245 dir->dir = opendir((const char *) name->data);
247 if (dir->dir == NULL) {
258 ngx_read_dir(ngx_dir_t *dir)
260 dir->de = readdir(dir->dir);
263 #if (NGX_HAVE_D_TYPE)
264 dir->type = dir->de->d_type;
265 dir->valid_type = dir->type ? 1 : 0;
277 ngx_open_glob(ngx_glob_t *gl)
281 n = glob((char *) gl->pattern, GLOB_NOSORT, NULL, &gl->pglob);
289 if (n == GLOB_NOMATCH && gl->test) {
300 ngx_read_glob(ngx_glob_t *gl, ngx_str_t *name)
305 count = (size_t) gl->pglob.gl_pathc;
307 count = (size_t) gl->pglob.gl_matchc;
312 name->len = (size_t) ngx_strlen(gl->pglob.gl_pathv[gl->n]);
313 name->data = (u_char *) gl->pglob.gl_pathv[gl->n];
324 ngx_close_glob(ngx_glob_t *gl)
326 globfree(&gl->pglob);
331 ngx_trylock_fd(ngx_fd_t fd)
339 fl.l_whence = SEEK_SET;
341 if (fcntl(fd, F_SETLK, &fl) == -1) {
350 ngx_lock_fd(ngx_fd_t fd)
358 fl.l_whence = SEEK_SET;
360 if (fcntl(fd, F_SETLKW, &fl) == -1) {
369 ngx_unlock_fd(ngx_fd_t fd)
377 fl.l_whence = SEEK_SET;
379 if (fcntl(fd, F_SETLK, &fl) == -1) {
387 #if (NGX_HAVE_O_DIRECT)
390 ngx_directio_on(ngx_fd_t fd)
394 flags = fcntl(fd, F_GETFL);
400 return fcntl(fd, F_SETFL, flags | O_DIRECT);
405 ngx_directio_off(ngx_fd_t fd)
409 flags = fcntl(fd, F_GETFL);
415 return fcntl(fd, F_SETFL, flags & ~O_DIRECT);