1 /**
2  * @copyright
3  * ====================================================================
4  *    Licensed to the Apache Software Foundation (ASF) under one
5  *    or more contributor license agreements.  See the NOTICE file
6  *    distributed with this work for additional information
7  *    regarding copyright ownership.  The ASF licenses this file
8  *    to you under the Apache License, Version 2.0 (the
9  *    "License"); you may not use this file except in compliance
10  *    with the License.  You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  *    Unless required by applicable law or agreed to in writing,
15  *    software distributed under the License is distributed on an
16  *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  *    KIND, either express or implied.  See the License for the
18  *    specific language governing permissions and limitations
19  *    under the License.
20  * ====================================================================
21  * @endcopyright
22  *
23  * @file svn_dep_compat.h
24  * @brief Compatibility macros and functions.
25  * @since New in 1.5.0.
26  */
27 
28 #ifndef SVN_DEP_COMPAT_H
29 #define SVN_DEP_COMPAT_H
30 
31 #include <apr_version.h>
32 #include <apr_errno.h>
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif /* __cplusplus */
37 
38 /**
39  * We assume that 'int' and 'unsigned' are at least 32 bits wide.
40  * This also implies that long (rev numbers) is 32 bits or wider.
41  *
42  * @since New in 1.9.
43  */
44 #if    defined(APR_HAVE_LIMITS_H) \
45     && !defined(SVN_ALLOW_SHORT_INTS) \
46     && (INT_MAX < 0x7FFFFFFFl)
47 #error int is shorter than 32 bits and may break Subversion. Define SVN_ALLOW_SHORT_INTS to skip this check.
48 #endif
49 
50 /**
51  * We assume that 'char' is 8 bits wide.  The critical interfaces are
52  * our repository formats and RA encodings.  E.g. a 32 bit wide char may
53  * mess up UTF8 parsing, how we interpret size values etc.
54  *
55  * @since New in 1.9.
56  */
57 #if    defined(CHAR_BIT) \
58     && !defined(SVN_ALLOW_NON_8_BIT_CHARS) \
59     && (CHAR_BIT != 8)
60 #error char is not 8 bits and may break Subversion. Define SVN_ALLOW_NON_8_BIT_CHARS to skip this check.
61 #endif
62 
63 /**
64  * Work around a platform dependency issue. apr_thread_rwlock_trywrlock()
65  * will make APR_STATUS_IS_EBUSY() return TRUE if the lock could not be
66  * acquired under Unix. Under Windows, this will not work. So, provide
67  * a more portable substitute.
68  *
69  * @since New in 1.8.
70  */
71 #ifdef WIN32
72 #define SVN_LOCK_IS_BUSY(x) \
73     (APR_STATUS_IS_EBUSY(x) || (x) == APR_FROM_OS_ERROR(WAIT_TIMEOUT))
74 #else
75 #define SVN_LOCK_IS_BUSY(x) APR_STATUS_IS_EBUSY(x)
76 #endif
77 
78 /**
79  * Indicate whether we are running on a POSIX platform.  This has
80  * implications on the way e.g. fsync() works.
81  *
82  * For details on this check, see
83  * http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system#POSIX
84  *
85  * @since New in 1.10.
86  */
87 #ifndef SVN_ON_POSIX
88 #if    !defined(_WIN32) \
89     && (   defined(__unix__) \
90         || defined(__unix) \
91         || (defined(__APPLE__) && defined(__MACH__)))  /* UNIX-style OS? */
92 #  include <unistd.h>
93 #  if defined(_POSIX_VERSION)
94 #    define SVN_ON_POSIX
95 #  endif
96 #endif
97 #endif
98 
99 /**
100  * APR keeps a few interesting defines hidden away in its private
101  * headers apr_arch_file_io.h, so we redefined them here.
102  *
103  * @since New in 1.9
104  */
105 #ifndef APR_FREADONLY
106 #define APR_FREADONLY 0x10000000
107 #endif
108 #ifndef APR_OPENINFO
109 #define APR_OPENINFO  0x00100000
110 #endif
111 
112 /**
113  * APR 1 has volatile qualifier bugs in some atomic prototypes that
114  * are fixed in APR 2:
115  *   https://issues.apache.org/bugzilla/show_bug.cgi?id=50731
116  * Subversion code should put the volatile qualifier in the correct
117  * place when declaring variables which means that casting at the call
118  * site is necessary when using APR 1.  No casts should be used with
119  * APR 2 as this allows the compiler to check that the variable has
120  * the correct volatile qualifier.
121  */
122 #if APR_VERSION_AT_LEAST(2,0,0)
123 #define svn_atomic_casptr(mem, with, cmp) \
124   apr_atomic_casptr((mem), (with), (cmp))
125 #define svn_atomic_xchgptr(mem, val) \
126   apr_atomic_xchgptr((mem), (val))
127 #else
128 #define svn_atomic_casptr(mem, with, cmp) \
129   apr_atomic_casptr((void volatile **)(mem), (with), (cmp))
130 #define svn_atomic_xchgptr(mem, val) \
131   apr_atomic_xchgptr((void volatile **)(mem), (val))
132 #endif
133 
134 /**
135  * Check at compile time if the Serf version is at least a certain
136  * level.
137  * @param major The major version component of the version checked
138  * for (e.g., the "1" of "1.3.0").
139  * @param minor The minor version component of the version checked
140  * for (e.g., the "3" of "1.3.0").
141  * @param patch The patch level component of the version checked
142  * for (e.g., the "0" of "1.3.0").
143  *
144  * @since New in 1.5.
145  */
146 #ifndef SERF_VERSION_AT_LEAST /* Introduced in Serf 0.1.1 */
147 #define SERF_VERSION_AT_LEAST(major,minor,patch)                       \
148 (((major) < SERF_MAJOR_VERSION)                                        \
149  || ((major) == SERF_MAJOR_VERSION && (minor) < SERF_MINOR_VERSION)    \
150  || ((major) == SERF_MAJOR_VERSION && (minor) == SERF_MINOR_VERSION && \
151      (patch) <= SERF_PATCH_VERSION))
152 #endif /* SERF_VERSION_AT_LEAST */
153 
154 /**
155  * By default, if libsvn is built against one version of SQLite
156  * and then run using an older version, svn will error out:
157  *
158  *     svn: Couldn't perform atomic initialization
159  *     svn: SQLite compiled for 3.7.4, but running with 3.7.3
160  *
161  * That can be annoying when building on a modern system in order
162  * to deploy on a less modern one.  So these constants allow one
163  * to specify how old the system being deployed on might be.
164  * For example,
165  *
166  *     EXTRA_CFLAGS += -DSVN_SQLITE_MIN_VERSION_NUMBER=3007003
167  *     EXTRA_CFLAGS += '-DSVN_SQLITE_MIN_VERSION="3.7.3"'
168  *
169  * turns on code that works around infelicities in older versions
170  * as far back as 3.7.3 and relaxes the check at initialization time
171  * to permit them.
172  *
173  * @since New in 1.8.
174  */
175 #ifndef SVN_SQLITE_MIN_VERSION_NUMBER
176 #define SVN_SQLITE_MIN_VERSION_NUMBER SQLITE_VERSION_NUMBER
177 #define SVN_SQLITE_MIN_VERSION SQLITE_VERSION
178 #endif /* SVN_SQLITE_MIN_VERSION_NUMBER */
179 
180 /**
181  * Check at compile time if the SQLite version is at least a certain
182  * level.
183  * @param major The major version component of the version checked
184  * for (e.g., the "1" of "1.3.0").
185  * @param minor The minor version component of the version checked
186  * for (e.g., the "3" of "1.3.0").
187  * @param patch The patch level component of the version checked
188  * for (e.g., the "0" of "1.3.0").
189  *
190  * @since New in 1.6.
191  */
192 #ifndef SQLITE_VERSION_AT_LEAST
193 #define SQLITE_VERSION_AT_LEAST(major,minor,patch)                     \
194 ((major*1000000 + minor*1000 + patch) <= SVN_SQLITE_MIN_VERSION_NUMBER)
195 #endif /* SQLITE_VERSION_AT_LEAST */
196 
197 /**
198  * Support for 'apr_escape_shell() which was introduced in APR 1.5.
199  */
200 #if !APR_VERSION_AT_LEAST(1,5,0)
201 /* from apr_escape.h */
202 #define APR_ESCAPE_STRING      (-1)
203 APR_DECLARE(apr_status_t) apr_escape_shell(char *escaped, const char *str,
204         apr_ssize_t slen, apr_size_t *len);
205 #endif
206 
207 #ifdef __cplusplus
208 }
209 #endif /* __cplusplus */
210 
211 #endif /* SVN_DEP_COMPAT_H */
212