1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26/*
27 *	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
28 *	  All Rights Reserved
29 */
30
31/*
32 * University Copyright- Copyright (c) 1982, 1986, 1988
33 * The Regents of the University of California
34 * All Rights Reserved
35 *
36 * University Acknowledgment- Portions of this document are derived from
37 * software developed by the University of California, Berkeley, and its
38 * contributors.
39 */
40
41#ifndef	_SYS_TYPES_H
42#define	_SYS_TYPES_H
43
44/*
45 * Include fixed width type declarations proposed by the ISO/JTC1/SC22/WG14 C
46 * committee's working draft for the revision of the current ISO C standard,
47 * ISO/IEC 9899:1990 Programming language - C.  These are not currently
48 * required by any standard but constitute a useful, general purpose set
49 * of type definitions which is namespace clean with respect to all standards.
50 */
51
52#include <sys/int_types.h>
53#include <sys/feature_tests.h>
54
55#ifdef __cplusplus
56extern "C" {
57#endif
58
59#ifndef _ASM
60
61/* From SunOS types.h */
62#if defined(mc68000)
63typedef	struct _physadr { short r[1]; } *physadr;
64typedef	struct _label { int val[13]; } label_t;
65#elif defined(__i386)
66typedef	struct _physadr { short r[1]; } *physadr;
67typedef	struct _label { int val[8]; } label_t;
68#elif defined(__sparc)
69typedef	struct _physadr { int r[1]; } *physadr;
70typedef	struct _label { int val[2]; } label_t;
71#else
72typedef	struct _physadr { int r[1]; } *physadr;
73typedef	struct _label { int val[10]; } label_t;
74#endif
75
76/* POSIX Extensions */
77
78typedef unsigned char   uchar_t;
79typedef unsigned short  ushort_t;
80typedef unsigned int    uint_t;
81typedef unsigned long   ulong_t;
82
83
84/* For BSD compatibility */
85typedef char 		*addr_t;	/* ?<core address> type */
86
87typedef char 		*caddr_t;	/* ?<core address> type */
88typedef long		daddr_t;	/* <disk address> type */
89typedef short		cnt_t;		/* ?<count> type */
90typedef ulong_t		pgcnt_t;	/* number of pages */
91
92#ifdef _ILP32
93typedef ulong_t 	paddr_t;	/* <physical address> type */
94typedef	long		swblk_t;
95#endif
96
97typedef uchar_t 	use_t;		/* use count for swap.  */
98typedef short		sysid_t;
99typedef short		index_t;
100typedef short		lock_t;		/* lock work for busy wait */
101typedef enum boolean { B_FALSE, B_TRUE } boolean_t;
102typedef ulong_t		l_dev_t;
103
104/*
105 * The following protects users who use other than Sun compilers
106 * (eg, GNU C) that don't support long long, and need to include
107 * this header file.
108 */
109#ifdef _LONGLONG_TYPE
110typedef	long long		longlong_t;
111typedef	unsigned long long	u_longlong_t;
112#else
113#ifdef GCC
114typedef int64_t longlong_t;
115typedef uint64_t u_longlong_t;
116#else
117/* used to reserve space and generate alignment */
118typedef	union {
119	int32_t	l[2];
120	double	d;
121} longlong_t;
122typedef	union {
123	uint32_t	l[2];
124	double		d;
125} u_longlong_t;
126#endif	/* GCC */
127#endif	/* _LONGLONG_TYPE */
128
129/*
130 * The {u,}pad64_t types can be used in structures such that those structures
131 * may be accessed by code produced by compilation environments which don't
132 * support a 64 bit integral datatype.  The intention is not to allow
133 * use of these fields in such environments, but to maintain the alignment
134 * and offsets of the structure.
135 *
136 * Similar comments for {u,}pad128_t.
137 *
138 * Note that these types do NOT generate any stronger alignment constraints
139 * than those available in the underlying ABI.  See <sys/isa_list.h>
140 */
141#ifdef _LONGLONG_TYPE
142typedef int64_t		pad64_t;
143typedef	uint64_t	upad64_t;
144#else
145typedef union {
146	double   _d;
147	int32_t  _l[2];
148} pad64_t;
149
150typedef union {
151	double   _d;
152	uint32_t _l[2];
153} upad64_t;
154#endif /* _LONGLONG_TYPE */
155
156typedef union {
157	long double	_q;
158	int32_t		_l[4];
159} pad128_t;
160
161typedef union {
162	long double	_q;
163	uint32_t	_l[4];
164} upad128_t;
165
166/*
167 * attributes for threads, dynamically allocated by library
168 */
169typedef	struct {
170	void	*__pthread_attrp;
171} pthread_attr_t;
172
173/* types related to file sizes, counts, offsets, etc. */
174#if defined(_LP64) || _FILE_OFFSET_BITS == 32
175typedef long		off_t;		/* ?<offset> type */
176typedef long		blkcnt_t;	/* counts file blocks */
177typedef ulong_t		fsblkcnt_t;	/* counts file system blocks */
178typedef ulong_t		fsfilcnt_t;	/* counts files */
179typedef ulong_t		ino_t;		/* expanded inode type	*/
180#elif _FILE_OFFSET_BITS == 64
181typedef longlong_t	off_t;		/* offsets within files */
182typedef longlong_t	blkcnt_t;	/* count of file blocks */
183typedef u_longlong_t	fsblkcnt_t;	/* count of file system blocks */
184typedef u_longlong_t	fsfilcnt_t;	/* count of files */
185typedef u_longlong_t	ino_t;		/* expanded inode type */
186#endif
187
188#ifdef _LP64
189typedef	int		blksize_t;	/* used for block sizes */
190#else
191typedef	long		blksize_t;	/* used for block sizes */
192#endif
193
194#ifdef _LARGEFILE64_SOURCE
195#ifdef _LP64
196typedef off_t		off64_t;
197typedef blkcnt_t	blkcnt64_t;
198typedef fsblkcnt_t	fsblkcnt64_t;
199typedef fsfilcnt_t	fsfilcnt64_t;
200typedef ino_t		ino64_t;
201#else
202typedef longlong_t	off64_t;	/* ?<offset> type */
203typedef longlong_t	blkcnt64_t;	/* counts file blocks */
204typedef u_longlong_t	fsblkcnt64_t;	/* counts file system blocks */
205typedef u_longlong_t	fsfilcnt64_t;	/* counts files */
206typedef u_longlong_t	ino64_t;	/* expanded inode type	*/
207#endif
208#endif
209
210/*
211 * The following type is for various kinds of identifiers.  The
212 * actual type must be the same for all since some system calls
213 * (such as sigsend) take arguments that may be any of these
214 * types.  The enumeration type idtype_t defined in sys/procset.h
215 * is used to indicate what type of id is being specified.
216 */
217
218typedef	longlong_t	offset_t;
219typedef	u_longlong_t	u_offset_t;
220typedef	longlong_t	diskaddr_t;
221
222/*
223 * These types (t_{u}scalar_t) exist because the XTI/TPI/DLPI standards had
224 * to use them instead of int32_t and uint32_t because DEC had
225 * shipped 64-bit wide.
226 */
227#if defined(_LP64) || defined(_I32LPx)
228typedef int32_t		t_scalar_t;
229typedef uint32_t	t_uscalar_t;
230#else
231typedef long		t_scalar_t;	/* historical versions */
232typedef unsigned long	t_uscalar_t;
233#endif	/* defined(_LP64) || defined(_I32LPx) */
234
235/*
236 * Partial support for 64-bit file offset enclosed herein,
237 * specifically used to access devices greater than 2gb.
238 * However, support for devices greater than 2gb requires compiler
239 * support for long long.
240 */
241#ifdef _LONG_LONG_LTOH
242typedef union lloff {
243	offset_t	_f;	/* Full 64 bit offset value */
244	struct {
245		int32_t _l;	/* lower 32 bits of offset value */
246		int32_t _u;	/* upper 32 bits of offset value */
247	} _p;
248} lloff_t;
249#endif
250
251#ifdef _LONG_LONG_HTOL
252typedef union lloff {
253	offset_t	_f;	/* Full 64 bit offset value */
254	struct {
255		int32_t _u;	/* upper 32 bits of offset value */
256		int32_t _l;	/* lower 32 bits of offset value */
257	} _p;
258} lloff_t;
259#endif
260
261#ifdef _LONG_LONG_LTOH
262typedef union lldaddr {
263	diskaddr_t	_f;	/* Full 64 bit disk address value */
264	struct {
265		int32_t _l;	/* lower 32 bits of disk address value */
266		int32_t _u;	/* upper 32 bits of disk address value */
267	} _p;
268} lldaddr_t;
269#endif
270
271#ifdef _LONG_LONG_HTOL
272typedef union lldaddr {
273	diskaddr_t	_f;	/* Full 64 bit disk address value */
274	struct {
275		int32_t _u;	/* upper 32 bits of disk address value */
276		int32_t _l;	/* lower 32 bits of disk address value */
277	} _p;
278} lldaddr_t;
279#endif
280
281typedef ulong_t k_fltset_t;	/* kernel fault set type */
282
283#if defined(_LP64) || defined(_I32LPx)
284typedef int		id_t;		/* A process id,	*/
285					/* process group id,	*/
286					/* session id,		*/
287					/* scheduling class id, */
288					/* user id or group id. */
289#else
290typedef long		id_t;
291#endif
292
293typedef void	*timeout_id_t;
294typedef void	*bufcall_id_t;
295
296/* Typedefs for dev_t components */
297
298#if !defined(_LP64) && defined(__cplusplus)
299typedef ulong_t major_t;	/* major part of device number */
300typedef ulong_t minor_t;	/* minor part of device number */
301#else
302typedef uint_t major_t;
303typedef uint_t minor_t;
304#endif
305
306typedef short	pri_t;
307
308/*
309 * For compatibility reasons the following typedefs (prefixed o_)
310 * can't grow regardless of the EFT definition. Although,
311 * applications should not explicitly use these typedefs
312 * they may be included via a system header definition.
313 * WARNING: These typedefs may be removed in a future
314 * release.
315 *		ex. the definitions in s5inode.h (now obsoleted)
316 *			remained small to preserve compatibility
317 *			in the S5 file system type.
318 */
319typedef ushort_t o_mode_t;		/* old file attribute type */
320typedef short	o_dev_t;		/* old device type	*/
321typedef ushort_t o_uid_t;		/* old UID type		*/
322typedef o_uid_t	o_gid_t;		/* old GID type		*/
323typedef short	o_nlink_t;		/* old file link type	*/
324typedef short	o_pid_t;		/* old process id type	*/
325typedef ushort_t o_ino_t;		/* old inode type	*/
326
327/* POSIX and XOPEN Declarations */
328
329typedef int	key_t;			/* IPC key type */
330#if !defined(_LP64) && defined(__cplusplus)
331typedef ulong_t	mode_t;			/* file attribute type  */
332#else
333typedef uint_t	mode_t;
334#endif
335
336#ifndef	_UID_T
337#define	_UID_T
338#if !defined(_LP64) && defined(__cplusplus)
339typedef long	uid_t;			/* UID type		*/
340#else
341typedef int	uid_t;
342#endif
343#endif
344
345typedef uid_t	gid_t;			/* GID type		*/
346typedef id_t	taskid_t;		/* task ID type		*/
347typedef id_t	projid_t;		/* project ID type	*/
348typedef	id_t	poolid_t;		/* pool ID type		*/
349typedef id_t	zoneid_t;		/* zone ID type		*/
350typedef id_t	ctid_t;			/* contract ID type	*/
351
352typedef uint32_t datalink_id_t;
353
354typedef ulong_t	dev_t;			/* expanded device type	*/
355
356#if !defined(_LP64) && defined(__cplusplus)
357typedef ulong_t	nlink_t;		/* file link type	*/
358typedef long	pid_t;			/* process id type	*/
359#else
360typedef uint_t	nlink_t;
361typedef int	pid_t;
362#endif
363
364#ifndef	_SIZE_T
365#define	_SIZE_T
366#if !defined(_LP64) && defined(__cplusplus)
367typedef uint_t	size_t;
368#else
369typedef ulong_t	size_t;
370#endif
371#endif
372
373#ifndef	_SSIZE_T
374#define	_SSIZE_T
375#if !defined(_LP64) && defined(__cplusplus)
376typedef int	ssize_t;
377#else
378typedef long	ssize_t;	/* used by functions which return a */
379				/* count of bytes or an error indication */
380#endif
381#endif
382
383#ifndef	_TIME_T
384#define	_TIME_T
385typedef long	time_t;		/* time of day in seconds */
386#endif  /* _TIME_T */
387
388#ifndef	_CLOCK_T
389#define	_CLOCK_T
390typedef long		clock_t; /* relative time in a specified resolution */
391#endif	/* ifndef _CLOCK_T */
392
393#if (defined(_KERNEL) || !defined(_POSIX_SOURCE))
394
395/* BEGIN CSTYLED */
396typedef unsigned char   unchar;
397typedef unsigned int    uint;
398typedef unsigned long   ulong;
399/* END CSTYLED */
400
401#if defined(_KERNEL)
402
403#define	SHRT_MIN	-32768		/* min value of a "short int" */
404#define	SHRT_MAX	32767		/* max value of a "short int" */
405#define	USHRT_MAX	65535u		/* max value of "unsigned short int" */
406#define	INT_MIN		(-2147483647-1)	/* min value of an "int" */
407#define	INT_MAX		2147483647	/* max value of an "int" */
408#define	UINT_MAX	4294967295u	/* max value of an "unsigned int" */
409#if !defined(_LP64)
410#define	LONG_MIN	(-2147483647L-1L)	/* min value of a "long int" */
411#define	LONG_MAX	2147483647L	/* max value of a "long int" */
412#define	ULONG_MAX	4294967295UL	/* max value of "unsigned long int" */
413#else
414#define	LONG_MIN	(-9223372036854775807L-1L)
415#define	LONG_MAX	9223372036854775807L
416#define	ULONG_MAX	18446744073709551615UL
417#endif
418
419#endif	/* defined(_KERNEL) */
420
421
422#define	P_MYPID	((pid_t)0)
423
424/*
425 * The following is the value of type id_t to use to indicate the
426 * caller's current id.  See procset.h for the type idtype_t
427 * which defines which kind of id is being specified.
428 */
429
430#define	P_MYID	(-1)
431#define	NOPID (pid_t)(-1)
432
433#ifndef	NODEV
434#define	NODEV (dev_t)(-1)
435#endif
436
437#ifdef _ILP32
438/*
439 * A host identifier is used to uniquely define a particular node
440 * on an rfs network.  Its type is as follows.
441 */
442
443typedef	long	hostid_t;
444
445/*
446 * The following value of type hostid_t is used to indicate the
447 * current host.  The actual hostid for each host is in the
448 * kernel global variable rfs_hostid.
449 */
450
451#define	P_MYHOSTID	(-1)
452#endif
453
454#endif /* END (defined(_KERNEL) || !defined(_POSIX_SOURCE)) */
455
456/* BEGIN CSTYLED */
457typedef unsigned char	u_char;
458typedef unsigned short	u_short;
459typedef unsigned int	u_int;
460typedef unsigned long	u_long;
461typedef unsigned short	ushort;		/* sys III compat */
462typedef struct _quad { int val[2]; } quad;	/* used by UFS */
463/* END CSTYLED */
464
465/*
466 * These were added to allow non-ANSI compilers to compile the system.
467 */
468
469#ifdef	__STDC__
470
471/* _VOID, const, volatile left in for source compatibility */
472
473/* BEGIN CSTYLED */
474#ifndef	_VOID
475#define	_VOID	void
476#endif
477
478#else
479
480#ifndef	_VOID
481#define	_VOID	char
482#endif
483
484#ifndef	const
485#define	const
486#endif
487
488#ifndef	volatile
489#define	volatile
490#endif
491/* END CSTYLED */
492
493#endif /* __STDC__ */
494
495#endif /* _ASM */
496
497/*
498 * Nested include for BSD/sockets source compatibility.
499 * (The select macros used to be defined here).
500 */
501#include <sys/select.h>
502/*
503 * Nested include for BSD compatibility.
504 */
505
506#define	AHZ 64
507
508#include <sys/sysmacros.h>
509
510#ifdef __cplusplus
511}
512#endif
513
514#endif	/* _SYS_TYPES_H */
515