1 /* 2 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 #ifndef _KRB5_DB2_MISC_H 7 #define _KRB5_DB2_MISC_H 8 9 10 #ifdef __cplusplus 11 extern "C" { 12 #endif 13 14 /* 15 * Copyright (c) 1991, 1993 16 * The Regents of the University of California. All rights reserved. 17 * 18 * Redistribution and use in source and binary forms, with or without 19 * modification, are permitted provided that the following conditions 20 * are met: 21 * 1. Redistributions of source code must retain the above copyright 22 * notice, this list of conditions and the following disclaimer. 23 * 2. Redistributions in binary form must reproduce the above copyright 24 * notice, this list of conditions and the following disclaimer in the 25 * documentation and/or other materials provided with the distribution. 26 * 3. All advertising materials mentioning features or use of this software 27 * must display the following acknowledgement: 28 * This product includes software developed by the University of 29 * California, Berkeley and its contributors. 30 * 4. Neither the name of the University nor the names of its contributors 31 * may be used to endorse or promote products derived from this software 32 * without specific prior written permission. 33 * 34 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 35 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 36 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 37 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 38 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 39 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 40 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 41 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 42 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 43 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 44 * SUCH DAMAGE. 45 * 46 * @(#)compat.h 8.13 (Berkeley) 2/21/94 47 */ 48 49 #ifndef _DB_INT_H_ 50 #define _DB_INT_H_ 51 52 #include "db.h" 53 54 /* deal with autoconf-based stuff */ 55 56 #define DB_LITTLE_ENDIAN 1234 57 #define DB_BIG_ENDIAN 4321 58 59 #include <stdlib.h> 60 #ifdef HAVE_ENDIAN_H 61 # include <endian.h> 62 #endif 63 #ifdef HAVE_MACHINE_ENDIAN_H 64 # include <machine/endian.h> 65 #endif 66 #ifdef HAVE_SYS_PARAM_H 67 # include <sys/param.h> 68 #endif 69 70 /* SUNW14resync: 71 The following code is disabled as it correctly determines the 72 endianness of the system. This would break backward compatability 73 for x86 as prior to this resync all architectures are treated 74 similarily - as big endian. See definition of "WORDS_BIGENDIAN" in 75 db-config.h. 76 */ 77 #if 0 78 /* Handle both BIG and LITTLE defined and BYTE_ORDER matches one, or 79 just one defined; both with and without leading underscores. 80 81 Ignore "PDP endian" machines, this code doesn't support them 82 anyways. */ 83 #if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN) && !defined(BYTE_ORDER) 84 # ifdef __LITTLE_ENDIAN__ 85 # define LITTLE_ENDIAN __LITTLE_ENDIAN__ 86 # endif 87 # ifdef __BIG_ENDIAN__ 88 # define BIG_ENDIAN __BIG_ENDIAN__ 89 # endif 90 #endif 91 #if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN) && !defined(BYTE_ORDER) 92 # ifdef _LITTLE_ENDIAN 93 # define LITTLE_ENDIAN _LITTLE_ENDIAN 94 # endif 95 # ifdef _BIG_ENDIAN 96 # define BIG_ENDIAN _BIG_ENDIAN 97 # endif 98 # ifdef _BYTE_ORDER 99 # define BYTE_ORDER _BYTE_ORDER 100 # endif 101 #endif 102 #if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN) && !defined(BYTE_ORDER) 103 # ifdef __LITTLE_ENDIAN 104 # define LITTLE_ENDIAN __LITTLE_ENDIAN 105 # endif 106 # ifdef __BIG_ENDIAN 107 # define BIG_ENDIAN __BIG_ENDIAN 108 # endif 109 # ifdef __BYTE_ORDER 110 # define BYTE_ORDER __BYTE_ORDER 111 # endif 112 #endif 113 114 #if defined(_MIPSEL) && !defined(LITTLE_ENDIAN) 115 # define LITTLE_ENDIAN 116 #endif 117 #if defined(_MIPSEB) && !defined(BIG_ENDIAN) 118 # define BIG_ENDIAN 119 #endif 120 121 #if defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN) && defined(BYTE_ORDER) 122 # if LITTLE_ENDIAN == BYTE_ORDER 123 # define DB_BYTE_ORDER DB_LITTLE_ENDIAN 124 # elif BIG_ENDIAN == BYTE_ORDER 125 # define DB_BYTE_ORDER DB_BIG_ENDIAN 126 # else 127 # error "LITTLE_ENDIAN and BIG_ENDIAN defined, but can't determine byte order" 128 # endif 129 #elif defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN) 130 # define DB_BYTE_ORDER DB_LITTLE_ENDIAN 131 #elif defined(BIG_ENDIAN) && !defined(LITTLE_ENDIAN) 132 # define DB_BYTE_ORDER DB_BIG_ENDIAN 133 #else 134 # error "can't determine byte order from included system headers" 135 #endif 136 137 #endif 138 139 140 #ifdef WORDS_BIGENDIAN 141 #define DB_BYTE_ORDER DB_BIG_ENDIAN 142 #else 143 #define DB_BYTE_ORDER DB_LITTLE_ENDIAN 144 #endif 145 146 /* end autoconf-based stuff */ 147 148 /* include necessary system header files */ 149 150 #ifdef HAVE_UNISTD_H 151 #include <unistd.h> 152 #endif 153 #include <limits.h> 154 #include <fcntl.h> 155 #include <stdio.h> 156 #include <errno.h> 157 #ifdef HAVE_STDINT_H 158 #include <stdint.h> 159 #endif 160 #ifdef HAVE_INTTYPES_H 161 /* Tru64 5.1: int8_t is defined here, and stdint.h doesn't exist. */ 162 #include <inttypes.h> 163 #endif 164 #include <sys/types.h> 165 #include <sys/stat.h> 166 #include <sys/param.h> 167 168 /* types and constants used for database structure */ 169 170 #define MAX_PAGE_NUMBER 0xffffffff /* >= # of pages in a file */ 171 typedef u_int32_t db_pgno_t; 172 #define MAX_PAGE_OFFSET 65535 /* >= # of bytes in a page */ 173 typedef u_int16_t indx_t; 174 #define MAX_REC_NUMBER 0xffffffff /* >= # of records in a tree */ 175 typedef u_int32_t recno_t; 176 177 /* 178 * Little endian <==> big endian 32-bit swap macros. 179 * M_32_SWAP swap a memory location 180 * P_32_SWAP swap a referenced memory location 181 * P_32_COPY swap from one location to another 182 */ 183 #define M_32_SWAP(a) { \ 184 u_int32_t _tmp = a; \ 185 ((char *)&a)[0] = ((char *)&_tmp)[3]; \ 186 ((char *)&a)[1] = ((char *)&_tmp)[2]; \ 187 ((char *)&a)[2] = ((char *)&_tmp)[1]; \ 188 ((char *)&a)[3] = ((char *)&_tmp)[0]; \ 189 } 190 #define P_32_SWAP(a) { \ 191 u_int32_t _tmp = *(u_int32_t *)a; \ 192 ((char *)a)[0] = ((char *)&_tmp)[3]; \ 193 ((char *)a)[1] = ((char *)&_tmp)[2]; \ 194 ((char *)a)[2] = ((char *)&_tmp)[1]; \ 195 ((char *)a)[3] = ((char *)&_tmp)[0]; \ 196 } 197 #define P_32_COPY(a, b) { \ 198 ((char *)&(b))[0] = ((char *)&(a))[3]; \ 199 ((char *)&(b))[1] = ((char *)&(a))[2]; \ 200 ((char *)&(b))[2] = ((char *)&(a))[1]; \ 201 ((char *)&(b))[3] = ((char *)&(a))[0]; \ 202 } 203 204 /* 205 * Little endian <==> big endian 16-bit swap macros. 206 * M_16_SWAP swap a memory location 207 * P_16_SWAP swap a referenced memory location 208 * P_16_COPY swap from one location to another 209 */ 210 #define M_16_SWAP(a) { \ 211 u_int16_t _tmp = a; \ 212 ((char *)&a)[0] = ((char *)&_tmp)[1]; \ 213 ((char *)&a)[1] = ((char *)&_tmp)[0]; \ 214 } 215 #define P_16_SWAP(a) { \ 216 u_int16_t _tmp = *(u_int16_t *)a; \ 217 ((char *)a)[0] = ((char *)&_tmp)[1]; \ 218 ((char *)a)[1] = ((char *)&_tmp)[0]; \ 219 } 220 #define P_16_COPY(a, b) { \ 221 ((char *)&(b))[0] = ((char *)&(a))[1]; \ 222 ((char *)&(b))[1] = ((char *)&(a))[0]; \ 223 } 224 225 /* open functions for each database type, used in dbopen() */ 226 227 #define __bt_open __kdb2_bt_open 228 #define __hash_open __kdb2_hash_open 229 #define __rec_open __kdb2_rec_open 230 #define __dbpanic __kdb2_dbpanic 231 232 DB *__bt_open __P((const char *, int, int, const BTREEINFO *, int)); 233 DB *__hash_open __P((const char *, int, int, const HASHINFO *, int)); 234 DB *__rec_open __P((const char *, int, int, const RECNOINFO *, int)); 235 void __dbpanic __P((DB *dbp)); 236 237 /* 238 * There is no portable way to figure out the maximum value of a file 239 * offset, so we put it here. 240 */ 241 #ifdef OFF_T_MAX 242 #define DB_OFF_T_MAX OFF_T_MAX 243 #else 244 #define DB_OFF_T_MAX LONG_MAX 245 #endif 246 247 #ifndef O_ACCMODE /* POSIX 1003.1 access mode mask. */ 248 #define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) 249 #endif 250 251 /* 252 * If you can't provide lock values in the open(2) call. Note, this 253 * allows races to happen. 254 */ 255 #ifndef O_EXLOCK /* 4.4BSD extension. */ 256 #define O_EXLOCK 0 257 #endif 258 259 #ifndef O_SHLOCK /* 4.4BSD extension. */ 260 #define O_SHLOCK 0 261 #endif 262 263 #ifndef EFTYPE 264 #define EFTYPE EINVAL /* POSIX 1003.1 format errno. */ 265 #endif 266 267 #ifndef STDERR_FILENO 268 #define STDIN_FILENO 0 /* ANSI C #defines */ 269 #define STDOUT_FILENO 1 270 #define STDERR_FILENO 2 271 #endif 272 273 #ifndef SEEK_END 274 #define SEEK_SET 0 /* POSIX 1003.1 seek values */ 275 #define SEEK_CUR 1 276 #define SEEK_END 2 277 #endif 278 279 #ifndef NULL /* ANSI C #defines NULL everywhere. */ 280 #define NULL 0 281 #endif 282 283 #ifndef MAX /* Usually found in <sys/param.h>. */ 284 #define MAX(_a,_b) ((_a)<(_b)?(_b):(_a)) 285 #endif 286 #ifndef MIN /* Usually found in <sys/param.h>. */ 287 #define MIN(_a,_b) ((_a)<(_b)?(_a):(_b)) 288 #endif 289 290 #ifndef S_ISDIR /* POSIX 1003.1 file type tests. */ 291 #define S_ISDIR(m) ((m & 0170000) == 0040000) /* directory */ 292 #define S_ISCHR(m) ((m & 0170000) == 0020000) /* char special */ 293 #define S_ISBLK(m) ((m & 0170000) == 0060000) /* block special */ 294 #define S_ISREG(m) ((m & 0170000) == 0100000) /* regular file */ 295 #define S_ISFIFO(m) ((m & 0170000) == 0010000) /* fifo */ 296 #endif 297 #ifndef S_ISLNK /* BSD POSIX 1003.1 extensions */ 298 #define S_ISLNK(m) ((m & 0170000) == 0120000) /* symbolic link */ 299 #define S_ISSOCK(m) ((m & 0170000) == 0140000) /* socket */ 300 #endif 301 302 #ifndef O_BINARY 303 #define O_BINARY 0 /* Needed for Win32 compiles */ 304 #endif 305 #endif /* _DB_INT_H_ */ 306 307 #ifdef __cplusplus 308 } 309 #endif 310 311 #endif /* !_KRB5_DB2_MISC_H */ 312