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)