/* * tclUnix.h -- * * This file reads in UNIX-related header files and sets up * UNIX-related macros for Tcl's UNIX core. It should be the * only file that contains #ifdefs to handle different flavors * of UNIX. This file sets up the union of all UNIX-related * things needed by any of the Tcl core files. This file * depends on configuration #defines in tclConfig.h * * The material in this file was originally contributed by * Karl Lehenbauer, Mark Diekhans and Peter da Silva. * * Copyright 1991 Regents of the University of California * Permission to use, copy, modify, and distribute this * software and its documentation for any purpose and without * fee is hereby granted, provided that this copyright * notice appears in all copies. The University of California * makes no representations about the suitability of this * software for any purpose. It is provided "as is" without * express or implied warranty. * */ #ifndef _TCLUNIX #define _TCLUNIX /* * The following #defines are used to distinguish between different * UNIX systems. These #defines are normally set by the "config" script * based on information it gets by looking in the include and library * areas. The defaults below are for BSD-based systems like SunOS * or Ultrix. * * TCL_GETTOD - 1 means there exists a library procedure * "gettimeofday" (e.g. BSD systems). 0 means * have to use "times" instead. * TCL_GETWD - 1 means there exists a library procedure * "getwd" (e.g. BSD systems). 0 means * have to use "getcwd" instead. * TCL_SYS_ERRLIST - 1 means that the array sys_errlist is * defined as part of the C library. * TCL_SYS_TIME_H - 1 means there exists an include file * (e.g. BSD derivatives). * TCL_SYS_WAIT_H - 1 means there exists an include file * that defines constants related * to the results of "wait". * TCL_UNION_WAIT - 1 means that the "wait" system call returns * a structure of type "union wait" (e.g. BSD * systems). 0 means "wait" returns an int * (e.g. System V and POSIX). * TCL_PID_T - 1 means that defines the type * pid_t. 0 means that it doesn't. * TCL_UID_T - 1 means that defines the type * uid_t. 0 means that it doesn't. */ #ifndef TCL_PID_T #define TCL_PID_T 1 #endif #ifndef TCL_GETTOD #define TCL_GETTOD 1 #endif /* TCL_GETTOD */ #ifndef TCL_GETWD #define TCL_GETWD 1 #endif /* TCL_GETWD */ #ifndef TCL_SYS_ERRLIST #define TCL_SYS_ERRLIST 1 #endif /* TCL_SYS_ERRLIST */ #ifndef TCL_SYS_TIME_H #define TCL_SYS_TIME_H 1 #endif /* TCL_SYS_TIME_H */ #ifndef TCL_SYS_WAIT_H #define TCL_SYS_WAIT_H 1 #endif /* TCL_SYS_WAIT_H */ #ifndef TCL_UNION_WAIT #define TCL_UNION_WAIT 1 #endif /* TCL_UNION_WAIT */ #ifndef TCL_UID_T #define TCL_UID_T 1 #endif /* TCL_UID_T */ #include #include #include #include #include #include #include #ifdef HAVE_DIRENT # include #else # include "compat/dirent.h" #endif #include #include #if TCL_SYS_TIME_H # include #else # include #endif #if TCL_SYS_WAIT_H # include #endif /* * Not all systems declare the errno variable in errno.h. so this * file does it explicitly. The list of system error messages also * isn't generally declared in a header file anywhere. */ extern int errno; extern int sys_nerr; extern char *sys_errlist[]; /* * The type of the status returned by wait varies from UNIX system * to UNIX system. The macro below defines it: */ #if TCL_UNION_WAIT # define WAIT_STATUS_TYPE union wait #else # define WAIT_STATUS_TYPE int #endif /* * Supply definitions for macros to query wait status, if not already * defined in header files above. */ #ifndef WIFEXITED # define WIFEXITED(stat) (((*((int *) &(stat))) & 0xff) == 0) #endif #ifndef WEXITSTATUS # define WEXITSTATUS(stat) (((*((int *) &(stat))) >> 8) & 0xff) #endif #ifndef WIFSIGNALED # define WIFSIGNALED(stat) (((*((int *) &(stat)))) && ((*((int *) &(stat))) == ((*((int *) &(stat))) & 0x00ff))) #endif #ifndef WTERMSIG # define WTERMSIG(stat) ((*((int *) &(stat))) & 0x7f) #endif #ifndef WIFSTOPPED # define WIFSTOPPED(stat) (((*((int *) &(stat))) & 0xff) == 0177) #endif #ifndef WSTOPSIG # define WSTOPSIG(stat) (((*((int *) &(stat))) >> 8) & 0xff) #endif /* * Supply macros for seek offsets, if they're not already provided by * an include file. */ #ifndef SEEK_SET # define SEEK_SET 0 #endif #ifndef SEEK_CUR # define SEEK_CUR 1 #endif #ifndef SEEK_END # define SEEK_END 2 #endif /* * The stuff below is needed by the "time" command. If this * system has no gettimeofday call, then must use times and the * CLK_TCK #define (from sys/param.h) to compute elapsed time. * Unfortunately, some systems only have HZ and no CLK_TCK, and * some might not even have HZ. */ #if ! TCL_GETTOD # include # include # ifndef CLK_TCK # ifdef HZ # define CLK_TCK HZ # else # define CLK_TCK 60 # endif # endif #endif /* * Define access mode constants if they aren't already defined. */ #ifndef F_OK # define F_OK 00 #endif #ifndef X_OK # define X_OK 01 #endif #ifndef W_OK # define W_OK 02 #endif #ifndef R_OK # define R_OK 04 #endif /* * On systems without symbolic links (i.e. S_IFLNK isn't defined) * define "lstat" to use "stat" instead. */ #ifndef S_IFLNK # define lstat stat #endif /* * Define macros to query file type bits, if they're not already * defined. */ #ifndef S_ISREG # ifdef S_IFREG # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) # else # define S_ISREG(m) 0 # endif # endif #ifndef S_ISDIR # ifdef S_IFDIR # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) # else # define S_ISDIR(m) 0 # endif # endif #ifndef S_ISCHR # ifdef S_IFCHR # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) # else # define S_ISCHR(m) 0 # endif # endif #ifndef S_ISBLK # ifdef S_IFBLK # define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) # else # define S_ISBLK(m) 0 # endif # endif #ifndef S_ISFIFO # ifdef S_IFIFO # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) # else # define S_ISFIFO(m) 0 # endif # endif #ifndef S_ISLNK # ifdef S_IFLNK # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) # else # define S_ISLNK(m) 0 # endif # endif #ifndef S_ISSOCK # ifdef S_IFSOCK # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) # else # define S_ISSOCK(m) 0 # endif # endif /* * Make sure that MAXPATHLEN is defined. */ #ifndef MAXPATHLEN # ifdef PATH_MAX # define MAXPATHLEN PATH_MAX # else # define MAXPATHLEN 2048 # endif #endif /* * Define pid_t and uid_t if they're not already defined. */ #if ! TCL_PID_T # define pid_t int #endif #if ! TCL_UID_T # define uid_t int #endif /* * Variables provided by the C library: */ #if defined(_sgi) || defined(__sgi) #define environ _environ #endif extern char **environ; /* * Library procedures used by Tcl but not declared in a header file: */ #ifndef _CRAY extern int access _ANSI_ARGS_((CONST char *path, int mode)); extern int chdir _ANSI_ARGS_((CONST char *path)); extern int close _ANSI_ARGS_((int fd)); extern int dup2 _ANSI_ARGS_((int src, int dst)); extern void endpwent _ANSI_ARGS_((void)); extern int execvp _ANSI_ARGS_((CONST char *name, char **argv)); extern void _exit _ANSI_ARGS_((int status)); extern pid_t fork _ANSI_ARGS_((void)); extern uid_t geteuid _ANSI_ARGS_((void)); extern pid_t getpid _ANSI_ARGS_((void)); extern char * getwd _ANSI_ARGS_((char *buffer)); extern int kill _ANSI_ARGS_((pid_t pid, int sig)); extern long lseek _ANSI_ARGS_((int fd, int offset, int whence)); extern char * mktemp _ANSI_ARGS_((char *template)); extern int pipe _ANSI_ARGS_((int *fdPtr)); extern int read _ANSI_ARGS_((int fd, char *buf, int numBytes)); extern int readlink _ANSI_ARGS_((CONST char *path, char *buf, int size)); extern int unlink _ANSI_ARGS_((CONST char *path)); extern int write _ANSI_ARGS_((int fd, char *buf, int numBytes)); #endif /* _CRAY */ #endif /* _TCLUNIX */