1 /* unified sys/types.h:
2    start with sef's sysvi386 version.
3    merge go32 version -- a few ifdefs.
4    h8300hms, h8300xray, and sysvnecv70 disagree on the following types:
5 
6    typedef int gid_t;
7    typedef int uid_t;
8    typedef int dev_t;
9    typedef int ino_t;
10    typedef int mode_t;
11    typedef int caddr_t;
12 
13    however, these aren't "reasonable" values, the sysvi386 ones make far
14    more sense, and should work sufficiently well (in particular, h8300
15    doesn't have a stat, and the necv70 doesn't matter.) -- eichin
16  */
17 
18 #ifndef _SYS_TYPES_H
19 
20 #include <_ansi.h>
21 
22 #ifndef __INTTYPES_DEFINED__
23 #define __INTTYPES_DEFINED__
24 typedef short int __int16_t;
25 typedef unsigned short int __uint16_t;
26 
27 #if __INT_MAX__ == 32767
28 typedef long int __int32_t;
29 typedef unsigned long int __uint32_t;
30 #else
31 typedef int __int32_t;
32 typedef unsigned int __uint32_t;
33 #endif
34 
35 #if __LONG_MAX__ > 2147483647 || !defined(__GNUC__)
36 typedef long int __int64_t;
37 typedef unsigned long int __uint64_t;
38 #else
39 __extension__ typedef long long __int64_t;
40 __extension__ typedef unsigned long long __uint64_t;
41 #endif
42 #endif /* ! __INTTYPES_DEFINED */
43 
44 #ifndef __need_inttypes
45 
46 #define _SYS_TYPES_H
47 #include <sys/_types.h>
48 
49 #ifdef __i386__
50 #if defined (GO32) || defined (__MSDOS__)
51 #define __MS_types__
52 #endif
53 #endif
54 
55 # include <stddef.h>
56 # include <machine/types.h>
57 
58 /* To ensure the stat struct's layout doesn't change when sizeof(int), etc.
59    changes, we assume sizeof short and long never change and have all types
60    used to define struct stat use them and not int where possible.
61    Where not possible, _ST_INTxx are used.  It would be preferable to not have
62    such assumptions, but until the extra fluff is necessary, it's avoided.
63    No 64 bit targets use stat yet.  What to do about them is postponed
64    until necessary.  */
65 #ifdef __GNUC__
66 #define _ST_INT32 __attribute__ ((__mode__ (__SI__)))
67 #else
68 #define _ST_INT32
69 #endif
70 
71 # ifndef	_POSIX_SOURCE
72 
73 #  define	physadr		physadr_t
74 #  define	quad		quad_t
75 
76 #ifndef _BSDTYPES_DEFINED
77 /* also defined in mingw/gmon.h and in w32api/winsock[2].h */
78 typedef	unsigned char	u_char;
79 typedef	unsigned short	u_short;
80 typedef	unsigned int	u_int;
81 typedef	unsigned long	u_long;
82 #define _BSDTYPES_DEFINED
83 #endif
84 
85 typedef	unsigned short	ushort;		/* System V compatibility */
86 typedef	unsigned int	uint;		/* System V compatibility */
87 # endif	/*!_POSIX_SOURCE */
88 
89 #ifndef __clock_t_defined
90 typedef _CLOCK_T_ clock_t;
91 #define __clock_t_defined
92 #endif
93 
94 #ifndef __time_t_defined
95 typedef _TIME_T_ time_t;
96 #define __time_t_defined
97 
98 /* Time Value Specification Structures, P1003.1b-1993, p. 261 */
99 
100 struct timespec {
101   time_t  tv_sec;   /* Seconds */
102   long    tv_nsec;  /* Nanoseconds */
103 };
104 
105 struct itimerspec {
106   struct timespec  it_interval;  /* Timer period */
107   struct timespec  it_value;     /* Timer expiration */
108 };
109 #endif
110 
111 typedef	long	daddr_t;
112 typedef	char *	caddr_t;
113 
114 #ifndef __CYGWIN__
115 #if defined(__MS_types__) || defined(__rtems__)
116 typedef	unsigned long	ino_t;
117 #else
118 #ifdef __sparc__
119 typedef	unsigned long	ino_t;
120 #else
121 typedef	unsigned short	ino_t;
122 #endif
123 #endif
124 #endif /*__CYGWIN__*/
125 
126 #ifdef __MS_types__
127 typedef unsigned long vm_offset_t;
128 typedef unsigned long vm_size_t;
129 
130 #define __BIT_TYPES_DEFINED__
131 
132 typedef signed char int8_t;
133 typedef unsigned char u_int8_t;
134 typedef short int16_t;
135 typedef unsigned short u_int16_t;
136 typedef int int32_t;
137 typedef unsigned int u_int32_t;
138 typedef long long int64_t;
139 typedef unsigned long long u_int64_t;
140 typedef int32_t register_t;
141 #endif /* __MS_types__ */
142 
143 /*
144  * All these should be machine specific - right now they are all broken.
145  * However, for all of Cygnus' embedded targets, we want them to all be
146  * the same.  Otherwise things like sizeof (struct stat) might depend on
147  * how the file was compiled (e.g. -mint16 vs -mint32, etc.).
148  */
149 
150 #if defined(__rtems__)
151 /* device numbers are 32-bit major and and 32-bit minor */
152 typedef unsigned long long dev_t;
153 #else
154 #ifndef __CYGWIN__
155 typedef	short	dev_t;
156 #endif
157 #endif
158 
159 #ifndef __CYGWIN__	/* which defines these types in it's own types.h. */
160 typedef long		off_t;
161 
162 typedef	unsigned short	uid_t;
163 typedef	unsigned short	gid_t;
164 #endif
165 
166 typedef int pid_t;
167 #ifndef __CYGWIN__
168 typedef	long key_t;
169 #endif
170 typedef _ssize_t ssize_t;
171 
172 #ifndef __CYGWIN__
173 #ifdef __MS_types__
174 typedef	char *	addr_t;
175 typedef int mode_t;
176 #else
177 #if defined (__sparc__) && !defined (__sparc_v9__)
178 #ifdef __svr4__
179 typedef unsigned long mode_t;
180 #else
181 typedef unsigned short mode_t;
182 #endif
183 #else
184 typedef unsigned int mode_t _ST_INT32;
185 #endif
186 #endif /* ! __MS_types__ */
187 #endif /*__CYGWIN__*/
188 
189 typedef unsigned short nlink_t;
190 
191 /* We don't define fd_set and friends if we are compiling POSIX
192    source, or if we have included (or may include as indicated
193    by __USE_W32_SOCKETS) the W32api winsock[2].h header which
194    defines Windows versions of them.   Note that a program which
195    includes the W32api winsock[2].h header must know what it is doing;
196    it must not call the cygwin32 select function.
197 */
198 # if !(defined (_POSIX_SOURCE) || defined (_WINSOCK_H) || defined (__USE_W32_SOCKETS))
199 #  define _SYS_TYPES_FD_SET
200 #  define	NBBY	8		/* number of bits in a byte */
201 /*
202  * Select uses bit masks of file descriptors in longs.
203  * These macros manipulate such bit fields (the filesystem macros use chars).
204  * FD_SETSIZE may be defined by the user, but the default here
205  * should be >= NOFILE (param.h).
206  */
207 #  ifndef	FD_SETSIZE
208 #	define	FD_SETSIZE	64
209 #  endif
210 
211 typedef	long	fd_mask;
212 #  define	NFDBITS	(sizeof (fd_mask) * NBBY)	/* bits per mask */
213 #  ifndef	howmany
214 #	define	howmany(x,y)	(((x)+((y)-1))/(y))
215 #  endif
216 
217 /* We use a macro for fd_set so that including Sockets.h afterwards
218    can work.  */
219 typedef	struct _types_fd_set {
220 	fd_mask	fds_bits[howmany(FD_SETSIZE, NFDBITS)];
221 } _types_fd_set;
222 
223 #define fd_set _types_fd_set
224 
225 #  define	FD_SET(n, p)	((p)->fds_bits[(n)/NFDBITS] |= (1L << ((n) % NFDBITS)))
226 #  define	FD_CLR(n, p)	((p)->fds_bits[(n)/NFDBITS] &= ~(1L << ((n) % NFDBITS)))
227 #  define	FD_ISSET(n, p)	((p)->fds_bits[(n)/NFDBITS] & (1L << ((n) % NFDBITS)))
228 #  define	FD_ZERO(p)	(__extension__ (void)({ \
229      size_t __i; \
230      char *__tmp = (char *)p; \
231      for (__i = 0; __i < sizeof (*(p)); ++__i) \
232        *__tmp++ = 0; \
233 }))
234 
235 # endif	/* !(defined (_POSIX_SOURCE) || defined (_WINSOCK_H) || defined (__USE_W32_SOCKETS)) */
236 
237 #undef __MS_types__
238 #undef _ST_INT32
239 
240 /* The following are actually standard POSIX 1003.1b-1993 threads, mutexes,
241    condition variables, and keys.  But since RTEMS is currently the only
242    newlib user of these, the ifdef is just on RTEMS. */
243 
244 #if defined(__rtems__) || defined(__CYGWIN__)
245 
246 #ifndef __clockid_t_defined
247 typedef _CLOCKID_T_ clockid_t;
248 #define __clockid_t_defined
249 #endif
250 
251 #ifndef __timer_t_defined
252 typedef _TIMER_T_ timer_t;
253 #define __timer_t_defined
254 #endif
255 
256 #if defined(__CYGWIN__) || defined(__rtems__)
257 typedef long useconds_t;
258 #endif
259 
260 #include <sys/features.h>
261 
262 
263 /* Cygwin will probably never have full posix compliance due to little things
264  * like an inability to set the stackaddress. Cygwin is also using void *
265  * pointers rather than structs to ensure maximum binary compatability with
266  * previous releases.
267  * This means that we don't use the types defined here, but rather in
268  * <cygwin/types.h>
269  */
270 #if defined(_POSIX_THREADS) && !defined(__CYGWIN__)
271 
272 #include <sys/sched.h>
273 
274 /*
275  *  2.5 Primitive System Data Types,  P1003.1c/D10, p. 19.
276  */
277 
278 typedef __uint32_t pthread_t;            /* identify a thread */
279 
280 /* P1003.1c/D10, p. 118-119 */
281 #define PTHREAD_SCOPE_PROCESS 0
282 #define PTHREAD_SCOPE_SYSTEM  1
283 
284 /* P1003.1c/D10, p. 111 */
285 #define PTHREAD_INHERIT_SCHED  1      /* scheduling policy and associated */
286                                       /*   attributes are inherited from */
287                                       /*   the calling thread. */
288 #define PTHREAD_EXPLICIT_SCHED 2      /* set from provided attribute object */
289 
290 /* P1003.1c/D10, p. 141 */
291 #define PTHREAD_CREATE_DETACHED 0
292 #define PTHREAD_CREATE_JOINABLE  1
293 
294 typedef struct {
295   int is_initialized;
296   void *stackaddr;
297   int stacksize;
298   int contentionscope;
299   int inheritsched;
300   int schedpolicy;
301   struct sched_param schedparam;
302 
303   /* P1003.4b/D8, p. 54 adds cputime_clock_allowed attribute.  */
304 #if defined(_POSIX_THREAD_CPUTIME)
305   int  cputime_clock_allowed;  /* see time.h */
306 #endif
307   int  detachstate;
308 
309 } pthread_attr_t;
310 
311 #if defined(_POSIX_THREAD_PROCESS_SHARED)
312 /* NOTE: P1003.1c/D10, p. 81 defines following values for process_shared.  */
313 
314 #define PTHREAD_PROCESS_PRIVATE 0 /* visible within only the creating process */
315 #define PTHREAD_PROCESS_SHARED  1 /* visible too all processes with access to */
316                                   /*   the memory where the resource is */
317                                   /*   located */
318 #endif
319 
320 #if defined(_POSIX_THREAD_PRIO_PROTECT)
321 /* Mutexes */
322 
323 /* Values for blocking protocol. */
324 
325 #define PTHREAD_PRIO_NONE    0
326 #define PTHREAD_PRIO_INHERIT 1
327 #define PTHREAD_PRIO_PROTECT 2
328 #endif
329 
330 typedef __uint32_t pthread_mutex_t;      /* identify a mutex */
331 
332 typedef struct {
333   int   is_initialized;
334 #if defined(_POSIX_THREAD_PROCESS_SHARED)
335   int   process_shared;  /* allow mutex to be shared amongst processes */
336 #endif
337 #if defined(_POSIX_THREAD_PRIO_PROTECT)
338   int   prio_ceiling;
339   int   protocol;
340 #endif
341   int   recursive;
342 } pthread_mutexattr_t;
343 
344 /* Condition Variables */
345 
346 typedef __uint32_t pthread_cond_t;       /* identify a condition variable */
347 
348 typedef struct {
349   int   is_initialized;
350 #if defined(_POSIX_THREAD_PROCESS_SHARED)
351   int   process_shared;       /* allow this to be shared amongst processes */
352 #endif
353 } pthread_condattr_t;         /* a condition attribute object */
354 
355 /* Keys */
356 
357 typedef __uint32_t pthread_key_t;        /* thread-specific data keys */
358 
359 typedef struct {
360   int   is_initialized;  /* is this structure initialized? */
361   int   init_executed;   /* has the initialization routine been run? */
362 } pthread_once_t;       /* dynamic package initialization */
363 #else
364 #if defined (__CYGWIN__)
365 #include <cygwin/types.h>
366 #endif
367 #endif /* defined(_POSIX_THREADS) */
368 
369 #endif  /* defined(__rtems__) */
370 
371 #endif  /* !__need_inttypes */
372 
373 #undef __need_inttypes
374 
375 #endif	/* _SYS_TYPES_H */
376