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 56 extern "C" { 57 #endif 58 59 #ifndef _ASM 60 61 /* From SunOS types.h */ 62 #if defined(mc68000) 63 typedef struct _physadr { short r[1]; } *physadr; 64 typedef struct _label { int val[13]; } label_t; 65 #elif defined(__i386) 66 typedef struct _physadr { short r[1]; } *physadr; 67 typedef struct _label { int val[8]; } label_t; 68 #elif defined(__sparc) 69 typedef struct _physadr { int r[1]; } *physadr; 70 typedef struct _label { int val[2]; } label_t; 71 #else 72 typedef struct _physadr { int r[1]; } *physadr; 73 typedef struct _label { int val[10]; } label_t; 74 #endif 75 76 /* POSIX Extensions */ 77 78 typedef unsigned char uchar_t; 79 typedef unsigned short ushort_t; 80 typedef unsigned int uint_t; 81 typedef unsigned long ulong_t; 82 83 84 /* For BSD compatibility */ 85 typedef char *addr_t; /* ?<core address> type */ 86 87 typedef char *caddr_t; /* ?<core address> type */ 88 typedef long daddr_t; /* <disk address> type */ 89 typedef short cnt_t; /* ?<count> type */ 90 typedef ulong_t pgcnt_t; /* number of pages */ 91 92 #ifdef _ILP32 93 typedef ulong_t paddr_t; /* <physical address> type */ 94 typedef long swblk_t; 95 #endif 96 97 typedef uchar_t use_t; /* use count for swap. */ 98 typedef short sysid_t; 99 typedef short index_t; 100 typedef short lock_t; /* lock work for busy wait */ 101 typedef enum boolean { B_FALSE, B_TRUE } boolean_t; 102 typedef 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 110 typedef long long longlong_t; 111 typedef unsigned long long u_longlong_t; 112 #else 113 #ifdef GCC 114 typedef int64_t longlong_t; 115 typedef uint64_t u_longlong_t; 116 #else 117 /* used to reserve space and generate alignment */ 118 typedef union { 119 int32_t l[2]; 120 double d; 121 } longlong_t; 122 typedef 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 142 typedef int64_t pad64_t; 143 typedef uint64_t upad64_t; 144 #else 145 typedef union { 146 double _d; 147 int32_t _l[2]; 148 } pad64_t; 149 150 typedef union { 151 double _d; 152 uint32_t _l[2]; 153 } upad64_t; 154 #endif /* _LONGLONG_TYPE */ 155 156 typedef union { 157 long double _q; 158 int32_t _l[4]; 159 } pad128_t; 160 161 typedef union { 162 long double _q; 163 uint32_t _l[4]; 164 } upad128_t; 165 166 /* 167 * attributes for threads, dynamically allocated by library 168 */ 169 typedef 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 175 typedef long off_t; /* ?<offset> type */ 176 typedef long blkcnt_t; /* counts file blocks */ 177 typedef ulong_t fsblkcnt_t; /* counts file system blocks */ 178 typedef ulong_t fsfilcnt_t; /* counts files */ 179 typedef ulong_t ino_t; /* expanded inode type */ 180 #elif _FILE_OFFSET_BITS == 64 181 typedef longlong_t off_t; /* offsets within files */ 182 typedef longlong_t blkcnt_t; /* count of file blocks */ 183 typedef u_longlong_t fsblkcnt_t; /* count of file system blocks */ 184 typedef u_longlong_t fsfilcnt_t; /* count of files */ 185 typedef u_longlong_t ino_t; /* expanded inode type */ 186 #endif 187 188 #ifdef _LP64 189 typedef int blksize_t; /* used for block sizes */ 190 #else 191 typedef long blksize_t; /* used for block sizes */ 192 #endif 193 194 #ifdef _LARGEFILE64_SOURCE 195 #ifdef _LP64 196 typedef off_t off64_t; 197 typedef blkcnt_t blkcnt64_t; 198 typedef fsblkcnt_t fsblkcnt64_t; 199 typedef fsfilcnt_t fsfilcnt64_t; 200 typedef ino_t ino64_t; 201 #else 202 typedef longlong_t off64_t; /* ?<offset> type */ 203 typedef longlong_t blkcnt64_t; /* counts file blocks */ 204 typedef u_longlong_t fsblkcnt64_t; /* counts file system blocks */ 205 typedef u_longlong_t fsfilcnt64_t; /* counts files */ 206 typedef 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 218 typedef longlong_t offset_t; 219 typedef u_longlong_t u_offset_t; 220 typedef 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) 228 typedef int32_t t_scalar_t; 229 typedef uint32_t t_uscalar_t; 230 #else 231 typedef long t_scalar_t; /* historical versions */ 232 typedef 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 242 typedef 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 252 typedef 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 262 typedef 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 272 typedef 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 281 typedef ulong_t k_fltset_t; /* kernel fault set type */ 282 283 #if defined(_LP64) || defined(_I32LPx) 284 typedef 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 290 typedef long id_t; 291 #endif 292 293 typedef void *timeout_id_t; 294 typedef void *bufcall_id_t; 295 296 /* Typedefs for dev_t components */ 297 298 #if !defined(_LP64) && defined(__cplusplus) 299 typedef ulong_t major_t; /* major part of device number */ 300 typedef ulong_t minor_t; /* minor part of device number */ 301 #else 302 typedef uint_t major_t; 303 typedef uint_t minor_t; 304 #endif 305 306 typedef 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 */ 319 typedef ushort_t o_mode_t; /* old file attribute type */ 320 typedef short o_dev_t; /* old device type */ 321 typedef ushort_t o_uid_t; /* old UID type */ 322 typedef o_uid_t o_gid_t; /* old GID type */ 323 typedef short o_nlink_t; /* old file link type */ 324 typedef short o_pid_t; /* old process id type */ 325 typedef ushort_t o_ino_t; /* old inode type */ 326 327 /* POSIX and XOPEN Declarations */ 328 329 typedef int key_t; /* IPC key type */ 330 #if !defined(_LP64) && defined(__cplusplus) 331 typedef ulong_t mode_t; /* file attribute type */ 332 #else 333 typedef uint_t mode_t; 334 #endif 335 336 #ifndef _UID_T 337 #define _UID_T 338 #if !defined(_LP64) && defined(__cplusplus) 339 typedef long uid_t; /* UID type */ 340 #else 341 typedef int uid_t; 342 #endif 343 #endif 344 345 typedef uid_t gid_t; /* GID type */ 346 typedef id_t taskid_t; /* task ID type */ 347 typedef id_t projid_t; /* project ID type */ 348 typedef id_t poolid_t; /* pool ID type */ 349 typedef id_t zoneid_t; /* zone ID type */ 350 typedef id_t ctid_t; /* contract ID type */ 351 352 typedef uint32_t datalink_id_t; 353 354 typedef ulong_t dev_t; /* expanded device type */ 355 356 #if !defined(_LP64) && defined(__cplusplus) 357 typedef ulong_t nlink_t; /* file link type */ 358 typedef long pid_t; /* process id type */ 359 #else 360 typedef uint_t nlink_t; 361 typedef int pid_t; 362 #endif 363 364 #ifndef _SIZE_T 365 #define _SIZE_T 366 #if !defined(_LP64) && defined(__cplusplus) 367 typedef uint_t size_t; 368 #else 369 typedef ulong_t size_t; 370 #endif 371 #endif 372 373 #ifndef _SSIZE_T 374 #define _SSIZE_T 375 #if !defined(_LP64) && defined(__cplusplus) 376 typedef int ssize_t; 377 #else 378 typedef 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 385 typedef long time_t; /* time of day in seconds */ 386 #endif /* _TIME_T */ 387 388 #ifndef _CLOCK_T 389 #define _CLOCK_T 390 typedef 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 */ 396 typedef unsigned char unchar; 397 typedef unsigned int uint; 398 typedef 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 443 typedef 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 */ 457 typedef unsigned char u_char; 458 typedef unsigned short u_short; 459 typedef unsigned int u_int; 460 typedef unsigned long u_long; 461 typedef unsigned short ushort; /* sys III compat */ 462 typedef 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