Mercurial > dovecot > core-2.2
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 |
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 | 2 |
1863 | 3 #include "config.h" |
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 | 8 #ifdef PREAD_WRAPPERS |
9 # define _XOPEN_SOURCE 500 /* Linux */ | |
10 #endif | |
1849 | 11 |
1863 | 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 | 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 | 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 | 21 |
22 #ifndef INADDR_NONE | |
23 # define INADDR_NONE INADDR_BROADCAST | |
24 #endif | |
25 | |
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 | 28 { |
29 while (*s1 != '\0' && i_toupper(*s1) == i_toupper(*s2)) { | |
30 s1++; s2++; | |
31 } | |
32 | |
33 return i_toupper(*s1) - i_toupper(*s2); | |
34 } | |
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 | 37 { |
4829 | 38 while (max_chars > 1 && *s1 != '\0' && |
0 | 39 i_toupper(*s1) == i_toupper(*s2)) { |
4829 | 40 s1++; s2++; max_chars--; |
0 | 41 } |
42 | |
43 return i_toupper(*s1) - i_toupper(*s2); | |
44 } | |
45 #endif | |
46 | |
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 | 49 { |
50 in_addr_t addr; | |
51 | |
52 addr = inet_addr(cp); | |
53 if (addr == INADDR_NONE) | |
54 return 0; | |
55 | |
56 inp->s_addr = addr; | |
57 return 1; | |
58 } | |
59 #endif | |
60 | |
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 | 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 | 67 } |
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 | 76 # ifdef __GNUC__ |
77 # warning Guessing page size to be 4096 | |
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 | 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 | 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 | 115 off_t old_offset; |
116 | |
117 old_offset = lseek(fd, 0, SEEK_CUR); | |
118 if (old_offset == -1) | |
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 | 121 if (lseek(fd, offset, SEEK_SET) < 0) |
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 | 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 | 131 } |
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 | 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 | 136 off_t old_offset; |
137 | |
138 old_offset = lseek(fd, 0, SEEK_CUR); | |
139 if (old_offset == -1) | |
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 | 142 if (lseek(fd, offset, SEEK_SET) < 0) |
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 | 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 | 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 | 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 | 161 } |
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 | 164 { |
165 return pwrite(fd, buf, count, offset); | |
166 } | |
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 |