1 /* system-dependent definitions for CVS. 2 Copyright (C) 1989-1992 Free Software Foundation, Inc. 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2, or (at your option) 7 any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. */ 13 14 /*** 15 *** Begin the default set of autoconf includes. 16 ***/ 17 18 /* Headers assumed for C89 freestanding compilers. See HACKING for more. */ 19 #include <limits.h> 20 #include <stdarg.h> 21 #include <stddef.h> 22 23 /* C89 hosted headers assumed since they were included in UNIX version 7. 24 * See HACKING for more. 25 */ 26 #include <assert.h> 27 #include <ctype.h> 28 #include <errno.h> 29 #include <signal.h> 30 #include <stdio.h> 31 32 /* C89 hosted headers we _think_ GCC supplies even on freestanding systems. 33 * If we find any systems which do not have them, a replacement header should 34 * be discussed with the GNULIB folks. 35 * 36 * For more information, please see the `Portability' section of the `HACKING' 37 * file. 38 */ 39 #include <stdlib.h> 40 #include <string.h> 41 42 /* We assume this because it has been around forever despite not being a part 43 * of any of the other standards we assume conformance to. So far this hasn't 44 * been a problem. 45 * 46 * For more information, please see the `Portability' section of the `HACKING' 47 * file. 48 */ 49 #include <sys/types.h> 50 51 /* A GNULIB replacement for this C99 header is supplied when it is missing. 52 * See the comments in stdbool_.h for its limitations. 53 */ 54 #include <stdbool.h> 55 56 /* Ditto for these POSIX.2 headers. */ 57 #include <fnmatch.h> 58 #include <getopt.h> /* Has GNU extensions, */ 59 60 /* We assume <sys/stat.h> because GNULIB does. */ 61 #include <sys/stat.h> 62 63 #if !STDC_HEADERS && HAVE_MEMORY_H 64 # include <memory.h> 65 #endif /* !STDC_HEADERS && HAVE_MEMORY_H */ 66 #if HAVE_INTTYPES_H 67 # include <inttypes.h> 68 #else /* ! HAVE_INTTYPES_H */ 69 # if HAVE_STDINT_H 70 # include <stdint.h> 71 # endif /* HAVE_STDINT_H */ 72 #endif /* HAVE_INTTYPES_H */ 73 #if HAVE_UNISTD_H 74 # include <unistd.h> 75 #endif /* HAVE_UNISTD_H */ 76 /* End the default set of autoconf includes */ 77 78 /* Assume these headers. */ 79 #include <pwd.h> 80 81 /* There is a replacement stub for gettext provided by GNULIB when gettext is 82 * not available. 83 */ 84 #include <gettext.h> 85 86 #ifndef DEVNULL 87 # define DEVNULL "/dev/null" 88 #endif 89 90 #ifdef HAVE_IO_H 91 #include <io.h> 92 #endif 93 94 #ifdef HAVE_DIRECT_H 95 #include <direct.h> 96 #endif 97 98 /* The NeXT (without _POSIX_SOURCE, which we don't want) has a utime.h 99 which doesn't define anything. It would be cleaner to have configure 100 check for struct utimbuf, but for now I'm checking NeXT here (so I don't 101 have to debug the configure check across all the machines). */ 102 #if defined (HAVE_UTIME_H) && !defined (NeXT) 103 # include <utime.h> 104 #else 105 # if defined (HAVE_SYS_UTIME_H) 106 # include <sys/utime.h> 107 # else 108 # ifndef ALTOS 109 struct utimbuf 110 { 111 long actime; 112 long modtime; 113 }; 114 # endif 115 int utime (); 116 # endif 117 #endif 118 119 /* errno.h variations: 120 * 121 * Not all systems set the same error code on a non-existent-file 122 * error. This tries to ask the question somewhat portably. 123 * On systems that don't have ENOTEXIST, this should behave just like 124 * x == ENOENT. "x" is probably errno, of course. 125 */ 126 #ifdef ENOTEXIST 127 # ifdef EOS2ERR 128 # define existence_error(x) \ 129 (((x) == ENOTEXIST) || ((x) == ENOENT) || ((x) == EOS2ERR)) 130 # else 131 # define existence_error(x) \ 132 (((x) == ENOTEXIST) || ((x) == ENOENT)) 133 # endif 134 #else 135 # ifdef EVMSERR 136 # define existence_error(x) \ 137 ((x) == ENOENT || (x) == EINVAL || (x) == EVMSERR) 138 # else 139 # define existence_error(x) ((x) == ENOENT) 140 # endif 141 #endif 142 143 /* check for POSIX signals */ 144 #if defined(HAVE_SIGACTION) && defined(HAVE_SIGPROCMASK) 145 # define POSIX_SIGNALS 146 #endif 147 148 /* MINIX 1.6 doesn't properly support sigaction */ 149 #if defined(_MINIX) 150 # undef POSIX_SIGNALS 151 #endif 152 153 /* If !POSIX, try for BSD.. Reason: 4.4BSD implements these as wrappers */ 154 #if !defined(POSIX_SIGNALS) 155 # if defined(HAVE_SIGVEC) && defined(HAVE_SIGSETMASK) && defined(HAVE_SIGBLOCK) 156 # define BSD_SIGNALS 157 # endif 158 #endif 159 160 /* Under OS/2, this must be included _after_ stdio.h; that's why we do 161 it here. */ 162 #ifdef USE_OWN_TCPIP_H 163 # include "tcpip.h" 164 #endif 165 166 #ifdef HAVE_FCNTL_H 167 # include <fcntl.h> 168 #else 169 # include <sys/file.h> 170 #endif 171 172 #ifndef SEEK_SET 173 # define SEEK_SET 0 174 # define SEEK_CUR 1 175 # define SEEK_END 2 176 #endif 177 178 #ifndef F_OK 179 # define F_OK 0 180 # define X_OK 1 181 # define W_OK 2 182 # define R_OK 4 183 #endif 184 185 #if HAVE_DIRENT_H 186 # include <dirent.h> 187 # define NAMLEN(dirent) strlen((dirent)->d_name) 188 #else 189 # define dirent direct 190 # define NAMLEN(dirent) (dirent)->d_namlen 191 # if HAVE_SYS_NDIR_H 192 # include <sys/ndir.h> 193 # endif 194 # if HAVE_SYS_DIR_H 195 # include <sys/dir.h> 196 # endif 197 # if HAVE_NDIR_H 198 # include <ndir.h> 199 # endif 200 #endif 201 202 /* Convert B 512-byte blocks to kilobytes if K is nonzero, 203 otherwise return it unchanged. */ 204 #define convert_blocks(b, k) ((k) ? ((b) + 1) / 2 : (b)) 205 206 /* Under non-UNIX operating systems (MS-DOS, WinNT, MacOS), many filesystem 207 calls take only one argument; permission is handled very differently on 208 those systems than in Unix. So we leave such systems a hook on which they 209 can hang their own definitions. */ 210 211 #ifndef CVS_ACCESS 212 # define CVS_ACCESS access 213 #endif 214 215 #ifndef CVS_CHDIR 216 # define CVS_CHDIR chdir 217 #endif 218 219 #ifndef CVS_CREAT 220 # define CVS_CREAT creat 221 #endif 222 223 #ifndef CVS_FOPEN 224 # define CVS_FOPEN fopen 225 #endif 226 227 #ifndef CVS_FDOPEN 228 # define CVS_FDOPEN fdopen 229 #endif 230 231 #ifndef CVS_MKDIR 232 # define CVS_MKDIR mkdir 233 #endif 234 235 #ifndef CVS_OPEN 236 # define CVS_OPEN open 237 #endif 238 239 #ifndef CVS_READDIR 240 # define CVS_READDIR readdir 241 #endif 242 243 #ifndef CVS_CLOSEDIR 244 # define CVS_CLOSEDIR closedir 245 #endif 246 247 #ifndef CVS_OPENDIR 248 # define CVS_OPENDIR opendir 249 #endif 250 251 #ifndef CVS_RENAME 252 # define CVS_RENAME rename 253 #endif 254 255 #ifndef CVS_RMDIR 256 # define CVS_RMDIR rmdir 257 #endif 258 259 #ifndef CVS_UNLINK 260 # define CVS_UNLINK unlink 261 #endif 262 263 /* Wildcard matcher. Should be case-insensitive if the system is. */ 264 #ifndef CVS_FNMATCH 265 # define CVS_FNMATCH fnmatch 266 #endif 267 268 #ifndef HAVE_FSEEKO 269 off_t ftello (FILE *); 270 int fseeko (FILE *, off_t, int); 271 #endif /* HAVE_FSEEKO */ 272 273 #ifdef FILENAMES_CASE_INSENSITIVE 274 275 # if defined (__CYGWIN32__) || defined (WOE32) 276 /* Under Windows, filenames are case-insensitive, and both / and \ 277 are path component separators. */ 278 # define FOLD_FN_CHAR(c) (WNT_filename_classes[(unsigned char) (c)]) 279 extern unsigned char WNT_filename_classes[]; 280 # else /* !__CYGWIN32__ && !WOE32 */ 281 /* As far as I know, only Macintosh OS X & VMS make it here, but any 282 * platform defining FILENAMES_CASE_INSENSITIVE which isn't WOE32 or 283 * piggy-backing the same could, in theory. Since the OS X fold just folds 284 * A-Z into a-z, I'm just allowing it to be used for any case insensitive 285 * system which we aren't yet making other specific folds or exceptions for. 286 * WOE32 needs its own class since \ and C:\ style absolute paths also need 287 * to be accounted for. 288 */ 289 # define FOLD_FN_CHAR(c) (OSX_filename_classes[(unsigned char) (c)]) 290 extern unsigned char OSX_filename_classes[]; 291 # endif /* __CYGWIN32__ || WOE32 */ 292 293 /* The following need to be declared for all case insensitive filesystems. 294 * When not FOLD_FN_CHAR is not #defined, a default definition for these 295 * functions is provided later in this header file. */ 296 297 /* Like strcmp, but with the appropriate tweaks for file names. */ 298 extern int fncmp (const char *n1, const char *n2); 299 300 /* Fold characters in FILENAME to their canonical forms. */ 301 extern void fnfold (char *FILENAME); 302 303 #endif /* FILENAMES_CASE_INSENSITIVE */ 304 305 306 307 /* Some file systems are case-insensitive. If FOLD_FN_CHAR is 308 #defined, it maps the character C onto its "canonical" form. In a 309 case-insensitive system, it would map all alphanumeric characters 310 to lower case. Under Windows NT, / and \ are both path component 311 separators, so FOLD_FN_CHAR would map them both to /. */ 312 #ifndef FOLD_FN_CHAR 313 # define FOLD_FN_CHAR(c) (c) 314 # define fnfold(filename) (filename) 315 # define fncmp strcmp 316 #endif 317 318 /* Different file systems can have different naming patterns which designate 319 * a path as absolute. 320 */ 321 #ifndef ISABSOLUTE 322 # define ISABSOLUTE(s) ISSLASH(s[FILE_SYSTEM_PREFIX_LEN(s)]) 323 #endif 324 325 326 /* On some systems, we have to be careful about writing/reading files 327 in text or binary mode (so in text mode the system can handle CRLF 328 vs. LF, VMS text file conventions, &c). We decide to just always 329 be careful. That way we don't have to worry about whether text and 330 binary differ on this system. We just have to worry about whether 331 the system has O_BINARY and "rb". The latter is easy; all ANSI C 332 libraries have it, SunOS4 has it, and CVS has used it unguarded 333 some places for a while now without complaints (e.g. "rb" in 334 server.c (server_updated), since CVS 1.8). The former is just an 335 #ifdef. */ 336 337 #define FOPEN_BINARY_READ ("rb") 338 #define FOPEN_BINARY_WRITE ("wb") 339 #define FOPEN_BINARY_READWRITE ("r+b") 340 341 #ifdef O_BINARY 342 #define OPEN_BINARY (O_BINARY) 343 #else 344 #define OPEN_BINARY (0) 345 #endif 346 347 #ifndef fd_select 348 # define fd_select select 349 #endif 350