Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib/write-full.c @ 8999:afc1b0ef120d HEAD
When :MAILBOXDIR= was empty, we might have appended extra '/' to it, which caused problems.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 30 Apr 2009 20:00:09 -0400 |
parents | b9faf4db2a9f |
children | 00cd9aacd03c |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
1 /* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */ |
29
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
183
4a7ab9e94f25
size_t fixes for lib/. Changed OFF_T_FORMAT to PRIuOFF_T which is more
Timo Sirainen <tss@iki.fi>
parents:
116
diff
changeset
|
3 #include "lib.h" |
579
e524da896d92
Several minor fixes: signess, casting away const, missing static, etc.
Timo Sirainen <tss@iki.fi>
parents:
183
diff
changeset
|
4 #include "write-full.h" |
183
4a7ab9e94f25
size_t fixes for lib/. Changed OFF_T_FORMAT to PRIuOFF_T which is more
Timo Sirainen <tss@iki.fi>
parents:
116
diff
changeset
|
5 |
29
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include <unistd.h> |
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 |
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 int write_full(int fd, const void *data, size_t size) |
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 { |
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 ssize_t ret; |
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
116
b1d05f79758f
write_full(): behave correctly if given size was 0.
Timo Sirainen <tss@iki.fi>
parents:
29
diff
changeset
|
12 while (size > 0) { |
183
4a7ab9e94f25
size_t fixes for lib/. Changed OFF_T_FORMAT to PRIuOFF_T which is more
Timo Sirainen <tss@iki.fi>
parents:
116
diff
changeset
|
13 ret = write(fd, data, size < SSIZE_T_MAX ? size : SSIZE_T_MAX); |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
14 if (unlikely(ret < 0)) |
29
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 return -1; |
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
17 if (unlikely(ret == 0)) { |
29
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 /* nothing was written, only reason for this should |
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 be out of disk space */ |
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 errno = ENOSPC; |
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 return -1; |
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 } |
1929 | 23 |
4020
fcfd44f56b04
While casting const pointers to something else, the const was often
Timo Sirainen <tss@iki.fi>
parents:
1929
diff
changeset
|
24 data = CONST_PTR_OFFSET(data, ret); |
29
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 size -= ret; |
116
b1d05f79758f
write_full(): behave correctly if given size was 0.
Timo Sirainen <tss@iki.fi>
parents:
29
diff
changeset
|
26 } |
29
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 return 0; |
e9375147c0cb
Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
30 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
31 int pwrite_full(int fd, const void *data, size_t size, off_t offset) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
32 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
33 ssize_t ret; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
34 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
35 while (size > 0) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
36 ret = pwrite(fd, data, size < SSIZE_T_MAX ? |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
37 size : SSIZE_T_MAX, offset); |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
38 if (unlikely(ret < 0)) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
39 return -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
40 |
6825
85385079b044
Use likely() and unlikely() macros to make commonly checked error handling
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
41 if (unlikely(ret == 0)) { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
42 /* nothing was written, only reason for this should |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
43 be out of disk space */ |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
44 errno = ENOSPC; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
45 return -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
46 } |
1929 | 47 |
4020
fcfd44f56b04
While casting const pointers to something else, the const was often
Timo Sirainen <tss@iki.fi>
parents:
1929
diff
changeset
|
48 data = CONST_PTR_OFFSET(data, ret); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
49 size -= ret; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
50 offset += ret; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
51 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
52 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
53 return 0; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1741
diff
changeset
|
54 } |