]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * tclUnix.h -- | |
3 | * | |
4 | * This file reads in UNIX-related header files and sets up | |
5 | * UNIX-related macros for Tcl's UNIX core. It should be the | |
6 | * only file that contains #ifdefs to handle different flavors | |
7 | * of UNIX. This file sets up the union of all UNIX-related | |
8 | * things needed by any of the Tcl core files. This file | |
9 | * depends on configuration #defines in tclConfig.h | |
10 | * | |
11 | * The material in this file was originally contributed by | |
12 | * Karl Lehenbauer, Mark Diekhans and Peter da Silva. | |
13 | * | |
14 | * Copyright 1991 Regents of the University of California | |
15 | * Permission to use, copy, modify, and distribute this | |
16 | * software and its documentation for any purpose and without | |
17 | * fee is hereby granted, provided that this copyright | |
18 | * notice appears in all copies. The University of California | |
19 | * makes no representations about the suitability of this | |
20 | * software for any purpose. It is provided "as is" without | |
21 | * express or implied warranty. | |
22 | * | |
23 | * $Header: /user6/ouster/tcl/RCS/tclUnix.h,v 1.26 92/08/03 08:27:43 ouster Exp $ SPRITE (Berkeley) | |
24 | */ | |
25 | ||
26 | #ifndef _TCLUNIX | |
27 | #define _TCLUNIX | |
28 | ||
29 | /* | |
30 | * The following #defines are used to distinguish between different | |
31 | * UNIX systems. These #defines are normally set by the "config" script | |
32 | * based on information it gets by looking in the include and library | |
33 | * areas. The defaults below are for BSD-based systems like SunOS | |
34 | * or Ultrix. | |
35 | * | |
36 | * TCL_GETTOD - 1 means there exists a library procedure | |
37 | * "gettimeofday" (e.g. BSD systems). 0 means | |
38 | * have to use "times" instead. | |
39 | * TCL_GETWD - 1 means there exists a library procedure | |
40 | * "getwd" (e.g. BSD systems). 0 means | |
41 | * have to use "getcwd" instead. | |
42 | * TCL_SYS_ERRLIST - 1 means that the array sys_errlist is | |
43 | * defined as part of the C library. | |
44 | * TCL_SYS_TIME_H - 1 means there exists an include file | |
45 | * <sys/time.h> (e.g. BSD derivatives). | |
46 | * TCL_SYS_WAIT_H - 1 means there exists an include file | |
47 | * <sys/wait.h> that defines constants related | |
48 | * to the results of "wait". | |
49 | * TCL_UNION_WAIT - 1 means that the "wait" system call returns | |
50 | * a structure of type "union wait" (e.g. BSD | |
51 | * systems). 0 means "wait" returns an int | |
52 | * (e.g. System V and POSIX). | |
53 | * TCL_PID_T - 1 means that <sys/types> defines the type | |
54 | * pid_t. 0 means that it doesn't. | |
55 | * TCL_UID_T - 1 means that <sys/types> defines the type | |
56 | * uid_t. 0 means that it doesn't. | |
57 | */ | |
58 | ||
59 | #define TCL_GETTOD 1 | |
60 | #define TCL_GETWD 0 | |
61 | #define TCL_SYS_ERRLIST 1 | |
62 | #define TCL_SYS_TIME_H 1 | |
63 | #define TCL_SYS_WAIT_H 1 | |
64 | #define TCL_UNION_WAIT 0 | |
65 | ||
66 | #ifdef IS_LINUX | |
67 | ||
68 | #define TCL_PID_T 1 | |
69 | #define TCL_UID_T 1 | |
70 | ||
71 | #else | |
72 | ||
73 | #define TCL_PID_T 0 | |
74 | #define TCL_UID_T 0 | |
75 | ||
76 | #endif | |
77 | ||
78 | #include <errno.h> | |
79 | #include <fcntl.h> | |
80 | #include <limits.h> | |
81 | #include <pwd.h> | |
82 | #include <signal.h> | |
83 | #include <sys/param.h> | |
84 | #include <sys/types.h> | |
85 | #include <dirent.h> | |
86 | #include <sys/file.h> | |
87 | #include <sys/stat.h> | |
88 | #if TCL_SYS_TIME_H | |
89 | # include <sys/time.h> | |
90 | #else | |
91 | # include <time.h> | |
92 | #endif | |
93 | #if TCL_SYS_WAIT_H | |
94 | # include <sys/wait.h> | |
95 | #endif | |
96 | ||
97 | /* | |
98 | * Not all systems declare the errno variable in errno.h. so this | |
99 | * file does it explicitly. The list of system error messages also | |
100 | * isn't generally declared in a header file anywhere. | |
101 | */ | |
102 | ||
103 | extern int errno; | |
104 | //extern int sys_nerr; | |
105 | //#ifndef IS_LINUX | |
106 | //extern char *sys_errlist[]; | |
107 | //#endif | |
108 | ||
109 | /* | |
110 | * The type of the status returned by wait varies from UNIX system | |
111 | * to UNIX system. The macro below defines it: | |
112 | */ | |
113 | ||
114 | #if TCL_UNION_WAIT | |
115 | # define WAIT_STATUS_TYPE union wait | |
116 | #else | |
117 | # define WAIT_STATUS_TYPE int | |
118 | #endif | |
119 | ||
120 | /* | |
121 | * Supply definitions for macros to query wait status, if not already | |
122 | * defined in header files above. | |
123 | */ | |
124 | ||
125 | #ifndef WIFEXITED | |
126 | # define WIFEXITED(stat) (((*((int *) &(stat))) & 0xff) == 0) | |
127 | #endif | |
128 | ||
129 | #ifndef WEXITSTATUS | |
130 | # define WEXITSTATUS(stat) (((*((int *) &(stat))) >> 8) & 0xff) | |
131 | #endif | |
132 | ||
133 | #ifndef WIFSIGNALED | |
134 | # define WIFSIGNALED(stat) (((*((int *) &(stat)))) && ((*((int *) &(stat))) == ((*((int *) &(stat))) & 0x00ff))) | |
135 | #endif | |
136 | ||
137 | #ifndef WTERMSIG | |
138 | # define WTERMSIG(stat) ((*((int *) &(stat))) & 0x7f) | |
139 | #endif | |
140 | ||
141 | #ifndef WIFSTOPPED | |
142 | # define WIFSTOPPED(stat) (((*((int *) &(stat))) & 0xff) == 0177) | |
143 | #endif | |
144 | ||
145 | #ifndef WSTOPSIG | |
146 | # define WSTOPSIG(stat) (((*((int *) &(stat))) >> 8) & 0xff) | |
147 | #endif | |
148 | ||
149 | /* | |
150 | * Supply macros for seek offsets, if they're not already provided by | |
151 | * an include file. | |
152 | */ | |
153 | ||
154 | #ifndef SEEK_SET | |
155 | # define SEEK_SET 0 | |
156 | #endif | |
157 | ||
158 | #ifndef SEEK_CUR | |
159 | # define SEEK_CUR 1 | |
160 | #endif | |
161 | ||
162 | #ifndef SEEK_END | |
163 | # define SEEK_END 2 | |
164 | #endif | |
165 | ||
166 | /* | |
167 | * The stuff below is needed by the "time" command. If this | |
168 | * system has no gettimeofday call, then must use times and the | |
169 | * CLK_TCK #define (from sys/param.h) to compute elapsed time. | |
170 | * Unfortunately, some systems only have HZ and no CLK_TCK, and | |
171 | * some might not even have HZ. | |
172 | */ | |
173 | ||
174 | #if ! TCL_GETTOD | |
175 | # include <sys/times.h> | |
176 | # include <sys/param.h> | |
177 | # ifndef CLK_TCK | |
178 | # ifdef HZ | |
179 | # define CLK_TCK HZ | |
180 | # else | |
181 | # define CLK_TCK 60 | |
182 | # endif | |
183 | # endif | |
184 | #endif | |
185 | ||
186 | /* | |
187 | * Define access mode constants if they aren't already defined. | |
188 | */ | |
189 | ||
190 | #ifndef F_OK | |
191 | # define F_OK 00 | |
192 | #endif | |
193 | #ifndef X_OK | |
194 | # define X_OK 01 | |
195 | #endif | |
196 | #ifndef W_OK | |
197 | # define W_OK 02 | |
198 | #endif | |
199 | #ifndef R_OK | |
200 | # define R_OK 04 | |
201 | #endif | |
202 | ||
203 | /* | |
204 | * On systems without symbolic links (i.e. S_IFLNK isn't defined) | |
205 | * define "lstat" to use "stat" instead. | |
206 | */ | |
207 | ||
208 | #ifndef S_IFLNK | |
209 | # define lstat stat | |
210 | #endif | |
211 | ||
212 | /* | |
213 | * Define macros to query file type bits, if they're not already | |
214 | * defined. | |
215 | */ | |
216 | ||
217 | #ifndef S_ISREG | |
218 | # ifdef S_IFREG | |
219 | # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) | |
220 | # else | |
221 | # define S_ISREG(m) 0 | |
222 | # endif | |
223 | # endif | |
224 | #ifndef S_ISDIR | |
225 | # ifdef S_IFDIR | |
226 | # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) | |
227 | # else | |
228 | # define S_ISDIR(m) 0 | |
229 | # endif | |
230 | # endif | |
231 | #ifndef S_ISCHR | |
232 | # ifdef S_IFCHR | |
233 | # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) | |
234 | # else | |
235 | # define S_ISCHR(m) 0 | |
236 | # endif | |
237 | # endif | |
238 | #ifndef S_ISBLK | |
239 | # ifdef S_IFBLK | |
240 | # define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) | |
241 | # else | |
242 | # define S_ISBLK(m) 0 | |
243 | # endif | |
244 | # endif | |
245 | #ifndef S_ISFIFO | |
246 | # ifdef S_IFIFO | |
247 | # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) | |
248 | # else | |
249 | # define S_ISFIFO(m) 0 | |
250 | # endif | |
251 | # endif | |
252 | #ifndef S_ISLNK | |
253 | # ifdef S_IFLNK | |
254 | # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) | |
255 | # else | |
256 | # define S_ISLNK(m) 0 | |
257 | # endif | |
258 | # endif | |
259 | #ifndef S_ISSOCK | |
260 | # ifdef S_IFSOCK | |
261 | # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) | |
262 | # else | |
263 | # define S_ISSOCK(m) 0 | |
264 | # endif | |
265 | # endif | |
266 | ||
267 | /* | |
268 | * Make sure that MAXPATHLEN is defined. | |
269 | */ | |
270 | ||
271 | #ifndef MAXPATHLEN | |
272 | # ifdef PATH_MAX | |
273 | # define MAXPATHLEN PATH_MAX | |
274 | # else | |
275 | # define MAXPATHLEN 2048 | |
276 | # endif | |
277 | #endif | |
278 | ||
279 | /* | |
280 | * Define pid_t and uid_t if they're not already defined. | |
281 | */ | |
282 | ||
283 | #if ! TCL_PID_T | |
284 | # define pid_t int | |
285 | #endif | |
286 | #if ! TCL_UID_T | |
287 | # define uid_t int | |
288 | #endif | |
289 | ||
290 | /* | |
291 | * Variables provided by the C library: | |
292 | */ | |
293 | ||
294 | extern char **environ; | |
295 | ||
296 | /* | |
297 | * Library procedures used by Tcl but not declared in a header file: | |
298 | */ | |
299 | ||
300 | #if 0 | |
301 | #ifndef _CRAY | |
302 | extern int access _ANSI_ARGS_((CONST char *path, int mode)); | |
303 | extern int chdir _ANSI_ARGS_((CONST char *path)); | |
304 | extern int close _ANSI_ARGS_((int fd)); | |
305 | extern int dup2 _ANSI_ARGS_((int src, int dst)); | |
306 | extern int execvp _ANSI_ARGS_((CONST char *name, char **argv)); | |
307 | extern void _exit _ANSI_ARGS_((int status)); | |
308 | extern pid_t fork _ANSI_ARGS_((void)); | |
309 | extern uid_t geteuid _ANSI_ARGS_((void)); | |
310 | extern pid_t getpid _ANSI_ARGS_((void)); | |
311 | extern char * getcwd _ANSI_ARGS_((char *buffer, int size)); | |
312 | extern char * getwd _ANSI_ARGS_((char *buffer)); | |
313 | extern int kill _ANSI_ARGS_((pid_t pid, int sig)); | |
314 | extern long lseek _ANSI_ARGS_((int fd, int offset, int whence)); | |
315 | extern char * mktemp _ANSI_ARGS_((char *template)); | |
316 | extern int open _ANSI_ARGS_((CONST char *path, int flags, ...)); | |
317 | extern int pipe _ANSI_ARGS_((int *fdPtr)); | |
318 | extern int read _ANSI_ARGS_((int fd, char *buf, int numBytes)); | |
319 | extern int readlink _ANSI_ARGS_((CONST char *path, char *buf, int size)); | |
320 | extern int unlink _ANSI_ARGS_((CONST char *path)); | |
321 | extern int write _ANSI_ARGS_((int fd, char *buf, int numBytes)); | |
322 | #endif /* _CRAY */ | |
323 | #endif | |
324 | ||
325 | #endif /* _TCLUNIX */ |