Mercurial > hg > nginx
comparison src/os/unix/ngx_files.c @ 3163:34cbd6e86218
handle short pwrite() to log an error cause: ENOSPC, EDQUOT, or EFBIG
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Fri, 25 Sep 2009 13:55:46 +0000 |
parents | a2c1b4f74ea7 |
children | b1b1775698d5 |
comparison
equal
deleted
inserted
replaced
3162:9140fbb2ab83 | 3163:34cbd6e86218 |
---|---|
57 | 57 |
58 | 58 |
59 ssize_t | 59 ssize_t |
60 ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) | 60 ngx_write_file(ngx_file_t *file, u_char *buf, size_t size, off_t offset) |
61 { | 61 { |
62 ssize_t n; | 62 ssize_t n, written; |
63 | 63 |
64 ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, | 64 ngx_log_debug4(NGX_LOG_DEBUG_CORE, file->log, 0, |
65 "write: %d, %p, %uz, %O", file->fd, buf, size, offset); | 65 "write: %d, %p, %uz, %O", file->fd, buf, size, offset); |
66 | 66 |
67 written = 0; | |
68 | |
67 #if (NGX_HAVE_PWRITE) | 69 #if (NGX_HAVE_PWRITE) |
68 | 70 |
69 n = pwrite(file->fd, buf, size, offset); | 71 for ( ;; ) { |
70 | 72 n = pwrite(file->fd, buf, size, offset); |
71 if (n == -1) { | 73 |
72 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, | 74 if (n == -1) { |
73 "pwrite() \"%s\" failed", file->name.data); | 75 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, |
74 return NGX_ERROR; | 76 "pwrite() \"%s\" failed", file->name.data); |
75 } | 77 return NGX_ERROR; |
76 | 78 } |
77 if ((size_t) n != size) { | 79 |
78 ngx_log_error(NGX_LOG_CRIT, file->log, 0, | 80 file->offset += n; |
79 "pwrite() \"%s\" has written only %z of %uz", | 81 written += n; |
80 file->name.data, n, size); | 82 |
81 return NGX_ERROR; | 83 if ((size_t) n == size) { |
84 return written; | |
85 } | |
86 | |
87 offset += n; | |
88 size -= n; | |
82 } | 89 } |
83 | 90 |
84 #else | 91 #else |
85 | 92 |
86 if (file->sys_offset != offset) { | 93 if (file->sys_offset != offset) { |
91 } | 98 } |
92 | 99 |
93 file->sys_offset = offset; | 100 file->sys_offset = offset; |
94 } | 101 } |
95 | 102 |
96 n = write(file->fd, buf, size); | 103 for ( ;; ) { |
97 | 104 n = write(file->fd, buf, size); |
98 if (n == -1) { | 105 |
99 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, | 106 if (n == -1) { |
100 "write() \"%s\" failed", file->name.data); | 107 ngx_log_error(NGX_LOG_CRIT, file->log, ngx_errno, |
101 return NGX_ERROR; | 108 "write() \"%s\" failed", file->name.data); |
102 } | 109 return NGX_ERROR; |
103 | 110 } |
104 if ((size_t) n != size) { | 111 |
105 ngx_log_error(NGX_LOG_CRIT, file->log, 0, | 112 file->offset += n; |
106 "write() \"%s\" has written only %z of %uz", | 113 written += n; |
107 file->name.data, n, size); | 114 |
108 return NGX_ERROR; | 115 if ((size_t) n == size) { |
109 } | 116 return written; |
110 | 117 } |
111 file->sys_offset += n; | 118 |
112 | 119 size -= n; |
113 #endif | 120 } |
114 | 121 #endif |
115 file->offset += n; | |
116 | |
117 return n; | |
118 } | 122 } |
119 | 123 |
120 | 124 |
121 ngx_fd_t | 125 ngx_fd_t |
122 ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access) | 126 ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access) |