annotate src/lib/compat.c @ 22664:fea53c2725c0

director: Fix director_max_parallel_moves/kicks type Should be uint, not time.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 09 Nov 2017 12:24:16 +0200
parents 2e2563132d5f
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 19552
diff changeset
1 /* Copyright (c) 2002-2017 Dovecot authors, see the included COPYING file */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
1863
d2f729d6f1e2 whops, too many changes
Timo Sirainen <tss@iki.fi>
parents: 1862
diff changeset
3 #include "config.h"
d2f729d6f1e2 whops, too many changes
Timo Sirainen <tss@iki.fi>
parents: 1862
diff changeset
4 #undef HAVE_CONFIG_H
5
1b34ec11fff8 Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
5
3475
ed186c6bbfd8 Added comment about config.h hack
Timo Sirainen <tss@iki.fi>
parents: 3237
diff changeset
6 /* Linux needs the _XOPEN_SOURCE define, but others don't. It needs to be
ed186c6bbfd8 Added comment about config.h hack
Timo Sirainen <tss@iki.fi>
parents: 3237
diff changeset
7 defined before unistd.h, so we need the above config.h include hack.. */
1863
d2f729d6f1e2 whops, too many changes
Timo Sirainen <tss@iki.fi>
parents: 1862
diff changeset
8 #ifdef PREAD_WRAPPERS
d2f729d6f1e2 whops, too many changes
Timo Sirainen <tss@iki.fi>
parents: 1862
diff changeset
9 # define _XOPEN_SOURCE 500 /* Linux */
d2f729d6f1e2 whops, too many changes
Timo Sirainen <tss@iki.fi>
parents: 1862
diff changeset
10 #endif
1849
83c635deda0b pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1804
diff changeset
11
1863
d2f729d6f1e2 whops, too many changes
Timo Sirainen <tss@iki.fi>
parents: 1862
diff changeset
12 #define IN_COMPAT_C
1852
29729fa90bb2 more kludgeing to get pread/pwrite working
Timo Sirainen <tss@iki.fi>
parents: 1849
diff changeset
13 #include "lib.h"
29729fa90bb2 more kludgeing to get pread/pwrite working
Timo Sirainen <tss@iki.fi>
parents: 1849
diff changeset
14
176
782a0d4baa71 missed header file with some conditions.
Timo Sirainen <tss@iki.fi>
parents: 5
diff changeset
15 #include <stdio.h>
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include <ctype.h>
5
1b34ec11fff8 Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
17 #include <unistd.h>
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #include <syslog.h>
10372
0b101a864534 Added a wrapper for strptime() to work around issues with glibc.
Timo Sirainen <tss@iki.fi>
parents: 10005
diff changeset
19 #include <time.h>
8076
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
20 #include <sys/time.h>
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 #ifndef INADDR_NONE
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 # define INADDR_NONE INADDR_BROADCAST
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 #endif
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 #if !defined (HAVE_STRCASECMP) && !defined (HAVE_STRICMP)
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
27 int i_my_strcasecmp(const char *s1, const char *s2)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 while (*s1 != '\0' && i_toupper(*s1) == i_toupper(*s2)) {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 s1++; s2++;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 return i_toupper(*s1) - i_toupper(*s2);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
36 int i_my_strncasecmp(const char *s1, const char *s2, size_t max_chars)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 {
4829
830cb3af6623 my_strncasecmp() was broken.
Timo Sirainen <tss@iki.fi>
parents: 3475
diff changeset
38 while (max_chars > 1 && *s1 != '\0' &&
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 i_toupper(*s1) == i_toupper(*s2)) {
4829
830cb3af6623 my_strncasecmp() was broken.
Timo Sirainen <tss@iki.fi>
parents: 3475
diff changeset
40 s1++; s2++; max_chars--;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 return i_toupper(*s1) - i_toupper(*s2);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 #endif
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 #ifndef HAVE_INET_ATON
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
48 int i_my_inet_aton(const char *cp, struct in_addr *inp)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 {
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 in_addr_t addr;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 addr = inet_addr(cp);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 if (addr == INADDR_NONE)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 return 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 inp->s_addr = addr;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 return 1;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 #endif
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 #ifndef HAVE_VSYSLOG
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
62 void i_my_vsyslog(int priority, const char *format, va_list args)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 {
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
64 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
65 syslog(priority, "%s", t_strdup_vprintf(format, args));
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
66 } T_END;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 #endif
5
1b34ec11fff8 Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
69
1b34ec11fff8 Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
70 #ifndef HAVE_GETPAGESIZE
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
71 int i_my_getpagesize(void)
5
1b34ec11fff8 Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
72 {
1b34ec11fff8 Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
73 #ifdef _SC_PAGESIZE
1b34ec11fff8 Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
74 return sysconf(_SC_PAGESIZE);
1b34ec11fff8 Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
75 #else
1427
892b52f53e27 Use #warning only with GCC.
Timo Sirainen <tss@iki.fi>
parents: 838
diff changeset
76 # ifdef __GNUC__
892b52f53e27 Use #warning only with GCC.
Timo Sirainen <tss@iki.fi>
parents: 838
diff changeset
77 # warning Guessing page size to be 4096
892b52f53e27 Use #warning only with GCC.
Timo Sirainen <tss@iki.fi>
parents: 838
diff changeset
78 # endif
5
1b34ec11fff8 Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
79 return 4096;
1b34ec11fff8 Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
80 #endif
1b34ec11fff8 Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
81 }
1b34ec11fff8 Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
82 #endif
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
83
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
84 #ifndef HAVE_WRITEV
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
85 ssize_t i_my_writev(int fd, const struct iovec *iov, int iov_len)
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
86 {
704
fdc1fafb533d writev()'s 3rd parameter is declared as "int" pretty much everywhere, so we
Timo Sirainen <tss@iki.fi>
parents: 482
diff changeset
87 size_t written;
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
88 ssize_t ret;
704
fdc1fafb533d writev()'s 3rd parameter is declared as "int" pretty much everywhere, so we
Timo Sirainen <tss@iki.fi>
parents: 482
diff changeset
89 int i;
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
90
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
91 written = 0;
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
92 for (i = 0; i < iov_len; i++, iov++) {
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
93 ret = write(fd, iov->iov_base, iov->iov_len);
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
94 if (ret < 0)
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
95 return -1;
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
96
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
97 written += ret;
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
98 if ((size_t)ret != iov->iov_len)
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
99 break;
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
100 }
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
101
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
102 if (written > SSIZE_T_MAX) {
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
103 errno = ERANGE;
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
104 return -1;
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
105 }
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
106
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
107 return (ssize_t)written;
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
108 }
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 176
diff changeset
109 #endif
1669
a0dd52443420 Added pwrite() compatibility
Timo Sirainen <tss@iki.fi>
parents: 1427
diff changeset
110
7822
5abe05d7d093 HP-UX: pread() and pwrite() are broken, use our own implementation.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
111 #if !defined(HAVE_PREAD) || defined(PREAD_BROKEN)
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
112 ssize_t i_my_pread(int fd, void *buf, size_t count, off_t offset)
1669
a0dd52443420 Added pwrite() compatibility
Timo Sirainen <tss@iki.fi>
parents: 1427
diff changeset
113 {
1804
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
114 ssize_t ret;
1862
3b25ea70b500 pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1852
diff changeset
115 off_t old_offset;
3b25ea70b500 pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1852
diff changeset
116
3b25ea70b500 pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1852
diff changeset
117 old_offset = lseek(fd, 0, SEEK_CUR);
3b25ea70b500 pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1852
diff changeset
118 if (old_offset == -1)
3b25ea70b500 pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1852
diff changeset
119 return -1;
1804
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
120
1669
a0dd52443420 Added pwrite() compatibility
Timo Sirainen <tss@iki.fi>
parents: 1427
diff changeset
121 if (lseek(fd, offset, SEEK_SET) < 0)
a0dd52443420 Added pwrite() compatibility
Timo Sirainen <tss@iki.fi>
parents: 1427
diff changeset
122 return -1;
1804
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
123
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
124 ret = read(fd, buf, count);
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
125 if (ret < 0)
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
126 return -1;
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
127
1862
3b25ea70b500 pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1852
diff changeset
128 if (lseek(fd, old_offset, SEEK_SET) < 0)
1804
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
129 return -1;
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
130 return ret;
1669
a0dd52443420 Added pwrite() compatibility
Timo Sirainen <tss@iki.fi>
parents: 1427
diff changeset
131 }
a0dd52443420 Added pwrite() compatibility
Timo Sirainen <tss@iki.fi>
parents: 1427
diff changeset
132
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
133 ssize_t i_my_pwrite(int fd, const void *buf, size_t count, off_t offset)
1669
a0dd52443420 Added pwrite() compatibility
Timo Sirainen <tss@iki.fi>
parents: 1427
diff changeset
134 {
1804
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
135 ssize_t ret;
1862
3b25ea70b500 pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1852
diff changeset
136 off_t old_offset;
3b25ea70b500 pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1852
diff changeset
137
3b25ea70b500 pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1852
diff changeset
138 old_offset = lseek(fd, 0, SEEK_CUR);
3b25ea70b500 pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1852
diff changeset
139 if (old_offset == -1)
3b25ea70b500 pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1852
diff changeset
140 return -1;
1804
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
141
1669
a0dd52443420 Added pwrite() compatibility
Timo Sirainen <tss@iki.fi>
parents: 1427
diff changeset
142 if (lseek(fd, offset, SEEK_SET) < 0)
a0dd52443420 Added pwrite() compatibility
Timo Sirainen <tss@iki.fi>
parents: 1427
diff changeset
143 return -1;
1804
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
144
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
145 ret = write(fd, buf, count);
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
146 if (ret < 0)
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
147 return -1;
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
148
1862
3b25ea70b500 pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1852
diff changeset
149 if (lseek(fd, old_offset, SEEK_SET) < 0)
1804
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
150 return -1;
e86000107a45 pread/pwrite doesn't move file offset. make our compat functions restore it
Timo Sirainen <tss@iki.fi>
parents: 1793
diff changeset
151 return ret;
1669
a0dd52443420 Added pwrite() compatibility
Timo Sirainen <tss@iki.fi>
parents: 1427
diff changeset
152 }
7822
5abe05d7d093 HP-UX: pread() and pwrite() are broken, use our own implementation.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
153 #elif defined(PREAD_WRAPPERS)
1852
29729fa90bb2 more kludgeing to get pread/pwrite working
Timo Sirainen <tss@iki.fi>
parents: 1849
diff changeset
154
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
155 ssize_t i_my_pread(int fd, void *buf, size_t count, off_t offset)
1849
83c635deda0b pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1804
diff changeset
156 {
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
157 ssize_t ret;
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
158
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
159 ret = pread(fd, buf, count, offset);
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
160 return ret;
1849
83c635deda0b pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1804
diff changeset
161 }
83c635deda0b pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1804
diff changeset
162
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
163 ssize_t i_my_pwrite(int fd, const void *buf, size_t count, off_t offset)
1849
83c635deda0b pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1804
diff changeset
164 {
83c635deda0b pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1804
diff changeset
165 return pwrite(fd, buf, count, offset);
83c635deda0b pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1804
diff changeset
166 }
83c635deda0b pread/pwrite fixes
Timo Sirainen <tss@iki.fi>
parents: 1804
diff changeset
167 #endif
2705
20dcf58cc05c Add seteuid() wrapper for HP-UX
Timo Sirainen <tss@iki.fi>
parents: 1863
diff changeset
168
20dcf58cc05c Add seteuid() wrapper for HP-UX
Timo Sirainen <tss@iki.fi>
parents: 1863
diff changeset
169 #ifndef HAVE_SETEUID
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
170 int i_my_seteuid(uid_t euid)
2705
20dcf58cc05c Add seteuid() wrapper for HP-UX
Timo Sirainen <tss@iki.fi>
parents: 1863
diff changeset
171 {
20dcf58cc05c Add seteuid() wrapper for HP-UX
Timo Sirainen <tss@iki.fi>
parents: 1863
diff changeset
172 #ifdef HAVE_SETREUID
20dcf58cc05c Add seteuid() wrapper for HP-UX
Timo Sirainen <tss@iki.fi>
parents: 1863
diff changeset
173 /* HP-UX at least doesn't have seteuid() but has setreuid() */
20dcf58cc05c Add seteuid() wrapper for HP-UX
Timo Sirainen <tss@iki.fi>
parents: 1863
diff changeset
174 return setreuid(-1, euid);
20dcf58cc05c Add seteuid() wrapper for HP-UX
Timo Sirainen <tss@iki.fi>
parents: 1863
diff changeset
175 #else
20dcf58cc05c Add seteuid() wrapper for HP-UX
Timo Sirainen <tss@iki.fi>
parents: 1863
diff changeset
176 # error Missing seteuid functionality
20dcf58cc05c Add seteuid() wrapper for HP-UX
Timo Sirainen <tss@iki.fi>
parents: 1863
diff changeset
177 #endif
20dcf58cc05c Add seteuid() wrapper for HP-UX
Timo Sirainen <tss@iki.fi>
parents: 1863
diff changeset
178 }
20dcf58cc05c Add seteuid() wrapper for HP-UX
Timo Sirainen <tss@iki.fi>
parents: 1863
diff changeset
179 #endif
2872
c0e2a38b7647 Check for libgen.h and if it's not found, use my_basename(). Also
Timo Sirainen <tss@iki.fi>
parents: 2705
diff changeset
180
3237
2f57438d9542 Added setegid() emulation for HP-UX.
Timo Sirainen <tss@iki.fi>
parents: 3002
diff changeset
181 #ifndef HAVE_SETEGID
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
182 int i_my_setegid(gid_t egid)
3237
2f57438d9542 Added setegid() emulation for HP-UX.
Timo Sirainen <tss@iki.fi>
parents: 3002
diff changeset
183 {
2f57438d9542 Added setegid() emulation for HP-UX.
Timo Sirainen <tss@iki.fi>
parents: 3002
diff changeset
184 #ifdef HAVE_SETRESGID
2f57438d9542 Added setegid() emulation for HP-UX.
Timo Sirainen <tss@iki.fi>
parents: 3002
diff changeset
185 /* HP-UX at least doesn't have setegid() but has setresgid() */
2f57438d9542 Added setegid() emulation for HP-UX.
Timo Sirainen <tss@iki.fi>
parents: 3002
diff changeset
186 return setresgid(-1, egid, -1);
2f57438d9542 Added setegid() emulation for HP-UX.
Timo Sirainen <tss@iki.fi>
parents: 3002
diff changeset
187 #else
2f57438d9542 Added setegid() emulation for HP-UX.
Timo Sirainen <tss@iki.fi>
parents: 3002
diff changeset
188 # error Missing setegid functionality
2f57438d9542 Added setegid() emulation for HP-UX.
Timo Sirainen <tss@iki.fi>
parents: 3002
diff changeset
189 #endif
2f57438d9542 Added setegid() emulation for HP-UX.
Timo Sirainen <tss@iki.fi>
parents: 3002
diff changeset
190 }
2f57438d9542 Added setegid() emulation for HP-UX.
Timo Sirainen <tss@iki.fi>
parents: 3002
diff changeset
191 #endif
2f57438d9542 Added setegid() emulation for HP-UX.
Timo Sirainen <tss@iki.fi>
parents: 3002
diff changeset
192
2872
c0e2a38b7647 Check for libgen.h and if it's not found, use my_basename(). Also
Timo Sirainen <tss@iki.fi>
parents: 2705
diff changeset
193 #ifndef HAVE_LIBGEN_H
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
194 char *i_my_basename(char *path)
2872
c0e2a38b7647 Check for libgen.h and if it's not found, use my_basename(). Also
Timo Sirainen <tss@iki.fi>
parents: 2705
diff changeset
195 {
c0e2a38b7647 Check for libgen.h and if it's not found, use my_basename(). Also
Timo Sirainen <tss@iki.fi>
parents: 2705
diff changeset
196 char *p;
c0e2a38b7647 Check for libgen.h and if it's not found, use my_basename(). Also
Timo Sirainen <tss@iki.fi>
parents: 2705
diff changeset
197
c0e2a38b7647 Check for libgen.h and if it's not found, use my_basename(). Also
Timo Sirainen <tss@iki.fi>
parents: 2705
diff changeset
198 /* note that this isn't POSIX-compliant basename() replacement.
c0e2a38b7647 Check for libgen.h and if it's not found, use my_basename(). Also
Timo Sirainen <tss@iki.fi>
parents: 2705
diff changeset
199 too much trouble without any gain. */
c0e2a38b7647 Check for libgen.h and if it's not found, use my_basename(). Also
Timo Sirainen <tss@iki.fi>
parents: 2705
diff changeset
200 p = strrchr(path, '/');
c0e2a38b7647 Check for libgen.h and if it's not found, use my_basename(). Also
Timo Sirainen <tss@iki.fi>
parents: 2705
diff changeset
201 return p == NULL ? path : p + 1;
c0e2a38b7647 Check for libgen.h and if it's not found, use my_basename(). Also
Timo Sirainen <tss@iki.fi>
parents: 2705
diff changeset
202 }
c0e2a38b7647 Check for libgen.h and if it's not found, use my_basename(). Also
Timo Sirainen <tss@iki.fi>
parents: 2705
diff changeset
203 #endif
3002
9f765960fca6 If strtoull() isn't supported, fallback to strtouq(). If that's not found
Timo Sirainen <tss@iki.fi>
parents: 2872
diff changeset
204
7850
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
205 #ifdef HAVE_OLD_VSNPRINTF
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
206 #undef vsnprintf
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
207 int i_my_vsnprintf(char *str, size_t size, const char *format, va_list ap)
7850
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
208 {
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
209 size_t tmp_size;
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
210 char *tmp;
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
211 int ret;
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
212
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
213 /* On overflow HP-UX returns -1, IRIX and Tru64 return size-1. */
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
214 ret = vsnprintf(str, size, format, ap);
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
215 if (ret >= 0 && (size_t)ret+1 != size)
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
216 return ret;
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
217
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
218 /* see if data stack has enough available space for it */
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
219 tmp_size = t_get_bytes_available();
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
220 if (tmp_size > size) {
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
221 tmp = t_buffer_get(tmp_size);
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
222 ret = vsnprintf(tmp, tmp_size, format, ap);
8514
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
223 if (ret >= 0 && (size_t)ret+1 != tmp_size) {
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
224 if (size > 0) {
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
225 memcpy(str, tmp, size-1);
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
226 str[size-1] = '\0';
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
227 }
7850
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
228 return ret;
8514
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
229 }
7850
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
230 } else {
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
231 tmp_size = size;
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
232 }
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
233
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
234 /* try to allocate enough memory to get it to fit. */
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
235 do {
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
236 tmp_size = nearest_power(tmp_size+1);
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
237 tmp = i_malloc(tmp_size);
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
238 ret = vsnprintf(tmp, tmp_size, format, ap);
8514
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
239 if (ret >= 0 && (size_t)ret+1 != tmp_size) {
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
240 if (size > 0) {
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
241 memcpy(str, tmp, size-1);
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
242 str[size-1] = '\0';
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
243 }
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
244 i_free(tmp);
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
245 return ret;
1bb73f69b3f3 my_vsnprintf() implementation was broken (for old non-C99 compliant OSes)
Timo Sirainen <tss@iki.fi>
parents: 8076
diff changeset
246 }
7850
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
247 i_free(tmp);
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
248 } while (tmp_size < 1024*1024);
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
249
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
250 i_panic("my_vsnprintf(): Output string too big");
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
251 }
7f9f7fc02359 Support systems with non-C99 vsnprintf().
Timo Sirainen <tss@iki.fi>
parents: 7847
diff changeset
252 #endif
8076
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
253
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
254 #ifndef HAVE_CLOCK_GETTIME
10005
910059d94bbc compat: Renamed all my_*() fallback functions to i_my_*().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
255 int i_my_clock_gettime(int clk_id, struct timespec *tp)
8076
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
256 {
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
257 struct timeval tv;
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
258
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
259 i_assert(clk_id == CLOCK_REALTIME);
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
260
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
261 /* fallback to using microseconds */
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
262 if (gettimeofday(&tv, NULL) < 0)
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
263 return -1;
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
264 tp->tv_sec = tv.tv_sec;
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
265 tp->tv_nsec = tv.tv_usec * 1000;
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
266 return 0;
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
267 }
bbfbc84f795c Added clock_gettime() compatibility function for systems without it.
Timo Sirainen <tss@iki.fi>
parents: 7850
diff changeset
268 #endif