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
11extern "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 */
171typedef u_int32_t	db_pgno_t;
172#define	MAX_PAGE_OFFSET	65535		/* >= # of bytes in a page */
173typedef u_int16_t	indx_t;
174#define	MAX_REC_NUMBER	0xffffffff	/* >= # of records in a tree */
175typedef 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
232DB	*__bt_open __P((const char *, int, int, const BTREEINFO *, int));
233DB	*__hash_open __P((const char *, int, int, const HASHINFO *, int));
234DB	*__rec_open __P((const char *, int, int, const RECNOINFO *, int));
235void	 __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