|
|
1.1 root 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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.