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