Mercurial > hg > nginx
comparison src/os/unix/ngx_files.c @ 74:17ab1af8c3dd
nginx-0.0.1-2003-04-11-20:01:14 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 11 Apr 2003 16:01:14 +0000 |
parents | 4534060fde92 |
children | 869b10be682f |
comparison
equal
deleted
inserted
replaced
73:4534060fde92 | 74:17ab1af8c3dd |
---|---|
1 | 1 |
2 #include <ngx_config.h> | 2 #include <ngx_config.h> |
3 #include <ngx_core.h> | 3 #include <ngx_core.h> |
4 #include <ngx_hunk.h> | |
5 #include <ngx_array.h> | |
4 #include <ngx_file.h> | 6 #include <ngx_file.h> |
7 #include <ngx_files.h> | |
8 | |
5 | 9 |
6 ssize_t ngx_read_file(ngx_file_t *file, char *buf, size_t size, off_t offset) | 10 ssize_t ngx_read_file(ngx_file_t *file, char *buf, size_t size, off_t offset) |
7 { | 11 { |
8 ssize_t n; | 12 ssize_t n; |
9 | 13 |
10 ngx_log_debug(file->log, "read: %x, %d, %qd" _ buf _ size _ offset); | 14 ngx_log_debug(file->log, "read: %x, %d, %qd" _ buf _ size _ offset); |
11 | 15 |
12 n = pread(file->fd, buf, size, offset); | 16 n = pread(file->fd, buf, size, offset); |
13 | 17 |
14 if (n == -1) { | 18 if (n == -1) { |
15 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, "pread() failed"); | 19 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "pread() failed"); |
16 return NGX_ERROR; | 20 return NGX_ERROR; |
17 } | 21 } |
18 | 22 |
19 file->offset += n; | 23 file->offset += n; |
20 | 24 |
27 ssize_t n; | 31 ssize_t n; |
28 | 32 |
29 n = pwrite(file->fd, buf, size, offset); | 33 n = pwrite(file->fd, buf, size, offset); |
30 | 34 |
31 if (n == -1) { | 35 if (n == -1) { |
32 ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno, "pwrite() failed"); | 36 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "pwrite() failed"); |
33 return NGX_ERROR; | 37 return NGX_ERROR; |
34 } | 38 } |
35 | 39 |
36 if (n != size) { | 40 if ((size_t) n != size) { |
37 ngx_log_error(NGX_LOG_ERR, file->log, 0, | 41 ngx_log_error(NGX_LOG_CRIT, file->log, 0, |
38 "pwrite() has written only %d of %d", n, size); | 42 "pwrite() has written only %d of %d", n, size); |
43 return NGX_ERROR; | |
44 } | |
45 | |
46 file->offset += n; | |
47 | |
48 return n; | |
49 } | |
50 | |
51 | |
52 ssize_t ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *ce, | |
53 off_t offset, ngx_pool_t *pool) | |
54 { | |
55 size_t size; | |
56 ssize_t n; | |
57 struct iovec *iov; | |
58 ngx_err_t err; | |
59 ngx_array_t io; | |
60 | |
61 /* use pwrite() if there's the only hunk in a chain */ | |
62 | |
63 if (ce->next == NULL) { | |
64 return ngx_write_file(file, ce->hunk->pos, | |
65 ce->hunk->last - ce->hunk->pos, offset); | |
66 } | |
67 | |
68 ngx_init_array(io, pool, 10, sizeof(struct iovec), NGX_ERROR); | |
69 size = 0; | |
70 | |
71 while (ce) { | |
72 ngx_test_null(iov, ngx_push_array(&io), NGX_ERROR); | |
73 iov->iov_base = ce->hunk->pos; | |
74 iov->iov_len = ce->hunk->last - ce->hunk->pos; | |
75 size += ce->hunk->last - ce->hunk->pos; | |
76 ce = ce->next; | |
77 } | |
78 | |
79 if (lseek(file->fd, offset, SEEK_SET) == -1) { | |
80 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "lseek() failed"); | |
81 return NGX_ERROR; | |
82 } | |
83 | |
84 n = writev(file->fd, (struct iovec *) io.elts, io.nelts); | |
85 | |
86 ngx_destroy_array(&io); | |
87 | |
88 if (n == -1) { | |
89 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, "writev() failed"); | |
90 return NGX_ERROR; | |
91 } | |
92 | |
93 if ((size_t) n != size) { | |
94 ngx_log_error(NGX_LOG_CRIT, file->log, 0, | |
95 "writev() has written only %d of %d", n, size); | |
39 return NGX_ERROR; | 96 return NGX_ERROR; |
40 } | 97 } |
41 | 98 |
42 file->offset += n; | 99 file->offset += n; |
43 | 100 |