xref: /freebsd/contrib/tcsh/tc.wait.h (revision 2be1a816b9ff69588e55be0a84cbe2a31efc0f2f)
1 /* $Header: /p/tcsh/cvsroot/tcsh/tc.wait.h,v 3.14 2004/12/25 21:15:08 christos Exp $ */
2 /*
3  * tc.wait.h: <sys/wait.h> for machines that don't have it or have it and
4  *	      is incorrect.
5  */
6 /*-
7  * Copyright (c) 1980, 1991 The Regents of the University of California.
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. Neither the name of the University nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34 #ifndef _h_tc_wait
35 #define _h_tc_wait
36 
37 /*
38  * a little complicated #include <sys/wait.h>! :-(
39  * We try to use the system's wait.h when we can...
40  */
41 
42 #if SYSVREL > 0 && !defined(linux) && !defined(__GNU__) && !defined(__GLIBC__)
43 # ifdef hpux
44 #  ifndef __hpux
45 #   define NEEDwait
46 #  else
47 #   ifndef POSIX
48 #    define _BSD
49 #   endif
50 #   ifndef _CLASSIC_POSIX_TYPES
51 #    define _CLASSIC_POSIX_TYPES
52 #   endif
53 #   include <sys/wait.h> /* 7.0 fixed it again */
54 #  endif /* __hpux */
55 # else /* hpux */
56 #  if (defined(OREO) || defined(IRIS4D) || defined(POSIX)) && !defined(_VMS_POSIX)
57 #   include <sys/wait.h>
58 #  else	/* OREO || IRIS4D || POSIX */
59 #   define NEEDwait
60 #  endif /* OREO || IRIS4D || POSIX */
61 # endif	/* hpux */
62 #else /* SYSVREL == 0 || glibc */
63 # ifdef _MINIX
64 #  undef NEEDwait
65 #  include "mi.wait.h"
66 # else
67 #  ifndef WINNT_NATIVE
68 #   include <sys/wait.h>
69 #  endif /* WINNT_NATIVE */
70 # endif /* _MINIX */
71 #endif /* SYSVREL == 0 || glibc */
72 
73 #ifdef NEEDwait
74 /*
75  *	This wait is for big-endians and little endians
76  */
77 union wait {
78     int     w_status;
79 # ifdef _SEQUENT_
80     struct {
81 	unsigned short w_Termsig:7;
82 	unsigned short w_Coredump:1;
83 	unsigned short w_Retcode:8;
84     }       w_T;
85     struct {
86 	unsigned short w_Stopval:8;
87 	unsigned short w_Stopsig:8;
88     }       w_S;
89 };
90 
91 #  define w_termsig     w_T.w_Termsig
92 #  define w_coredump    w_T.w_Coredump
93 #  define w_retcode     w_T.w_Retcode
94 #  define w_stopval     w_S.w_Stopval
95 #  define w_stopsig     w_S.w_Stopsig
96 # else /* _SEQUENT_ */
97 #  if defined(vax) || defined(__vax__) || defined(i386) || defined(_I386) || defined(__i386__)
98     union {
99 	struct {
100 	    unsigned int w_Termsig:7;
101 	    unsigned int w_Coredump:1;
102 	    unsigned int w_Retcode:8;
103 	    unsigned int w_Dummy:16;
104 	}       w_T;
105 	struct {
106 	    unsigned int w_Stopval:8;
107 	    unsigned int w_Stopsig:8;
108 	    unsigned int w_Dummy:16;
109 	}       w_S;
110     }       w_P;
111 #  else /* mc68000 || sparc || ??? */
112 #    if defined(_CRAY) || defined(ANY_OTHER_64BIT_MACHINE)
113 #      define DUMMY_BITS	48
114 #    else /* _CRAY */
115 #      define DUMMY_BITS	16
116 #    endif /* _CRAY */
117     union {
118 	struct {
119 	    unsigned int w_Dummy:DUMMY_BITS;
120 	    unsigned int w_Retcode:8;
121 	    unsigned int w_Coredump:1;
122 	    unsigned int w_Termsig:7;
123 	}       w_T;
124 	struct {
125 	    unsigned int w_Dummy:DUMMY_BITS;
126 	    unsigned int w_Stopsig:8;
127 	    unsigned int w_Stopval:8;
128 	}       w_S;
129     }       w_P;
130 #  endif /* vax || __vax__ || i386 || _I386 || __i386__ */
131 };
132 
133 #  define w_termsig	w_P.w_T.w_Termsig
134 #  define w_coredump	w_P.w_T.w_Coredump
135 #  define w_retcode	w_P.w_T.w_Retcode
136 #  define w_stopval	w_P.w_S.w_Stopval
137 #  define w_stopsig	w_P.w_S.w_Stopsig
138 # endif /* _SEQUENT_ */
139 
140 
141 # ifndef WNOHANG
142 #  define WNOHANG	1	/* dont hang in wait */
143 # endif
144 
145 # ifndef WUNTRACED
146 #  define WUNTRACED	2	/* tell about stopped, untraced children */
147 # endif
148 
149 # define WSTOPPED 0177
150 # define WIFSTOPPED(x)	((x).w_stopval == WSTOPPED)
151 # define WIFSIGNALED(x)	(((x).w_stopval != WSTOPPED) && ((x).w_termsig != 0))
152 
153 #endif /* NEEDwait */
154 
155 #endif /* _h_tc_wait */
156