Bring cvs-1.12.9 into the CVS repository
[dragonfly.git] / contrib / cvs-1.12.9 / lib / system.h
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 this POSIX.2 header.  */
57 #include <fnmatch.h>
58
59 /* For struct timespec.  */
60 #include "timespec.h"
61
62
63
64 #if HAVE_SYS_STAT_H
65 # include <sys/stat.h>
66 #endif /* HAVE_SYS_STAT_H */
67 #if !STDC_HEADERS && HAVE_MEMORY_H
68 # include <memory.h>
69 #endif /* !STDC_HEADERS && HAVE_MEMORY_H */
70 #if HAVE_INTTYPES_H
71 # include <inttypes.h>
72 #else /* ! HAVE_INTTYPES_H */
73 # if HAVE_STDINT_H
74 #  include <stdint.h>
75 # endif /* HAVE_STDINT_H */
76 #endif /* HAVE_INTTYPES_H */
77 #if HAVE_UNISTD_H
78 # include <unistd.h>
79 #endif /* HAVE_UNISTD_H */
80 /* End the default set of autoconf includes */
81
82 /* Assume these headers. */
83 #include <pwd.h>
84
85 /* This include enables the use of the *_unlocked IO functions from glibc. */
86 #include "unlocked-io.h"
87
88 /* GNULIB includes */
89 #include <gettext.h>
90
91 #ifdef STAT_MACROS_BROKEN
92 #undef S_ISBLK
93 #undef S_ISCHR
94 #undef S_ISDIR
95 #undef S_ISREG
96 #undef S_ISFIFO
97 #undef S_ISLNK
98 #undef S_ISSOCK
99 #undef S_ISMPB
100 #undef S_ISMPC
101 #undef S_ISNWK
102 #endif
103
104 /* Not all systems have S_IFMT, but we want to use it if we have it.
105    The S_IFMT code below looks right (it masks and compares).  The
106    non-S_IFMT code looks bogus (are there really systems on which
107    S_IFBLK, S_IFLNK, &c, each have their own bit?  I suspect it was
108    written for OS/2 using the IBM C/C++ Tools 2.01 compiler).
109
110    Of course POSIX systems will have S_IS*, so maybe the issue is
111    semi-moot.  */
112
113 #if !defined(S_ISBLK) && defined(S_IFBLK)
114 # if defined(S_IFMT)
115 # define        S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
116 # else
117 # define S_ISBLK(m) ((m) & S_IFBLK)
118 # endif
119 #endif
120
121 #if !defined(S_ISCHR) && defined(S_IFCHR)
122 # if defined(S_IFMT)
123 # define        S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
124 # else
125 # define S_ISCHR(m) ((m) & S_IFCHR)
126 # endif
127 #endif
128
129 #if !defined(S_ISDIR) && defined(S_IFDIR)
130 # if defined(S_IFMT)
131 # define        S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
132 # else
133 # define S_ISDIR(m) ((m) & S_IFDIR)
134 # endif
135 #endif
136
137 #if !defined(S_ISREG) && defined(S_IFREG)
138 # if defined(S_IFMT)
139 # define        S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
140 # else
141 # define S_ISREG(m) ((m) & S_IFREG)
142 # endif
143 #endif
144
145 #if !defined(S_ISFIFO) && defined(S_IFIFO)
146 # if defined(S_IFMT)
147 # define        S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
148 # else
149 # define S_ISFIFO(m) ((m) & S_IFIFO)
150 # endif
151 #endif
152
153 #if !defined(S_ISLNK) && defined(S_IFLNK)
154 # if defined(S_IFMT)
155 # define        S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
156 # else
157 # define S_ISLNK(m) ((m) & S_IFLNK)
158 # endif
159 #endif
160
161 #ifndef S_ISSOCK
162 # if defined( S_IFSOCK )
163 #   ifdef S_IFMT
164 #     define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
165 #   else
166 #     define S_ISSOCK(m) ((m) & S_IFSOCK)
167 #   endif /* S_IFMT */
168 # elif defined( S_ISNAM )
169     /* SCO OpenServer 5.0.6a */
170 #   define S_ISSOCK S_ISNAM
171 # endif /* !S_IFSOCK && S_ISNAM */
172 #endif /* !S_ISSOCK */
173
174 #if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */
175 # if defined(S_IFMT)
176 # define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
177 # define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
178 # else
179 # define S_ISMPB(m) ((m) & S_IFMPB)
180 # define S_ISMPC(m) ((m) & S_IFMPC)
181 # endif
182 #endif
183
184 #if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */
185 # if defined(S_IFMT)
186 # define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
187 # else
188 # define S_ISNWK(m) ((m) & S_IFNWK)
189 # endif
190 #endif
191
192 #ifdef NEED_DECOY_PERMISSIONS        /* OS/2, really */
193
194 #define S_IRUSR S_IREAD
195 #define S_IWUSR S_IWRITE
196 #define S_IXUSR S_IEXEC
197 #define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
198 #define S_IRGRP S_IREAD
199 #define S_IWGRP S_IWRITE
200 #define S_IXGRP S_IEXEC
201 #define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
202 #define S_IROTH S_IREAD
203 #define S_IWOTH S_IWRITE
204 #define S_IXOTH S_IEXEC
205 #define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
206
207 #else /* ! NEED_DECOY_PERMISSIONS */
208
209 #ifndef S_IRUSR
210 #define S_IRUSR 0400
211 #define S_IWUSR 0200
212 #define S_IXUSR 0100
213 /* Read, write, and execute by owner.  */
214 #define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR)
215
216 #define S_IRGRP (S_IRUSR >> 3)  /* Read by group.  */
217 #define S_IWGRP (S_IWUSR >> 3)  /* Write by group.  */
218 #define S_IXGRP (S_IXUSR >> 3)  /* Execute by group.  */
219 /* Read, write, and execute by group.  */
220 #define S_IRWXG (S_IRWXU >> 3)
221
222 #define S_IROTH (S_IRGRP >> 3)  /* Read by others.  */
223 #define S_IWOTH (S_IWGRP >> 3)  /* Write by others.  */
224 #define S_IXOTH (S_IXGRP >> 3)  /* Execute by others.  */
225 /* Read, write, and execute by others.  */
226 #define S_IRWXO (S_IRWXG >> 3)
227 #endif /* !def S_IRUSR */
228 #endif /* NEED_DECOY_PERMISSIONS */
229
230 #if defined(POSIX) || defined(HAVE_UNISTD_H)
231 # include <unistd.h>
232 #else
233 off_t lseek ();
234 char *getcwd ();
235 #endif
236
237 #ifdef HAVE_IO_H
238 #include <io.h>
239 #endif
240
241 #ifdef HAVE_DIRECT_H
242 #include <direct.h>
243 #endif
244
245 /* The NeXT (without _POSIX_SOURCE, which we don't want) has a utime.h
246    which doesn't define anything.  It would be cleaner to have configure
247    check for struct utimbuf, but for now I'm checking NeXT here (so I don't
248    have to debug the configure check across all the machines).  */
249 #if defined (HAVE_UTIME_H) && !defined (NeXT)
250 #  include <utime.h>
251 #else
252 #  if defined (HAVE_SYS_UTIME_H)
253 #    include <sys/utime.h>
254 #  else
255 #    ifndef ALTOS
256 struct utimbuf
257 {
258   long actime;
259   long modtime;
260 };
261 #    endif
262 int utime ();
263 #  endif
264 #endif
265
266 /* errno.h variations:
267  *
268  * Not all systems set the same error code on a non-existent-file
269  * error.  This tries to ask the question somewhat portably.
270  * On systems that don't have ENOTEXIST, this should behave just like
271  * x == ENOENT.  "x" is probably errno, of course.
272  */
273 #ifdef ENOTEXIST
274 #  ifdef EOS2ERR
275 #    define existence_error(x) \
276      (((x) == ENOTEXIST) || ((x) == ENOENT) || ((x) == EOS2ERR))
277 #  else
278 #    define existence_error(x) \
279      (((x) == ENOTEXIST) || ((x) == ENOENT))
280 #  endif
281 #else
282 #  ifdef EVMSERR
283 #     define existence_error(x) \
284 ((x) == ENOENT || (x) == EINVAL || (x) == EVMSERR)
285 #  else
286 #    define existence_error(x) ((x) == ENOENT)
287 #  endif
288 #endif
289
290 #ifdef HAVE_MALLOC
291 # define CVS_MALLOC malloc
292 # else /* !HAVE_MALLOC */
293 # define CVS_MALLOC rpl_malloc
294 #endif /* HAVE_MALLOC */
295 #ifdef HAVE_REALLOC
296 # define CVS_REALLOC realloc
297 #else /* !HAVE_REALLOC */
298 # define CVS_REALLOC rpl_realloc
299 #endif /* HAVE_REALLOC */
300
301 #ifndef HAVE_STDLIB_H
302 char *getenv ();
303 char *malloc ();
304 char *realloc ();
305 char *calloc ();
306 extern int errno;
307 #endif
308
309 /* check for POSIX signals */
310 #if defined(HAVE_SIGACTION) && defined(HAVE_SIGPROCMASK)
311 # define POSIX_SIGNALS
312 #endif
313
314 /* MINIX 1.6 doesn't properly support sigaction */
315 #if defined(_MINIX)
316 # undef POSIX_SIGNALS
317 #endif
318
319 /* If !POSIX, try for BSD.. Reason: 4.4BSD implements these as wrappers */
320 #if !defined(POSIX_SIGNALS)
321 # if defined(HAVE_SIGVEC) && defined(HAVE_SIGSETMASK) && defined(HAVE_SIGBLOCK)
322 #  define BSD_SIGNALS
323 # endif
324 #endif
325
326 /* Under OS/2, this must be included _after_ stdio.h; that's why we do
327    it here. */
328 #ifdef USE_OWN_TCPIP_H
329 # include "tcpip.h"
330 #endif
331
332 #ifdef HAVE_FCNTL_H
333 # include <fcntl.h>
334 #else
335 # include <sys/file.h>
336 #endif
337
338 #ifndef SEEK_SET
339 # define SEEK_SET 0
340 # define SEEK_CUR 1
341 # define SEEK_END 2
342 #endif
343
344 #ifndef F_OK
345 # define F_OK 0
346 # define X_OK 1
347 # define W_OK 2
348 # define R_OK 4
349 #endif
350
351 #if HAVE_DIRENT_H
352 # include <dirent.h>
353 # define NAMLEN(dirent) strlen((dirent)->d_name)
354 #else
355 # define dirent direct
356 # define NAMLEN(dirent) (dirent)->d_namlen
357 # if HAVE_SYS_NDIR_H
358 #  include <sys/ndir.h>
359 # endif
360 # if HAVE_SYS_DIR_H
361 #  include <sys/dir.h>
362 # endif
363 # if HAVE_NDIR_H
364 #  include <ndir.h>
365 # endif
366 #endif
367
368 /* Convert B 512-byte blocks to kilobytes if K is nonzero,
369    otherwise return it unchanged. */
370 #define convert_blocks(b, k) ((k) ? ((b) + 1) / 2 : (b))
371
372 #ifndef S_ISLNK
373 # define lstat stat
374 #endif
375
376 /*
377  * Some UNIX distributions don't include these in their stat.h Defined here
378  * because "config.h" is always included last.
379  */
380 #ifndef S_IWRITE
381 # define        S_IWRITE        0000200    /* write permission, owner */
382 #endif
383 #ifndef S_IWGRP
384 # define        S_IWGRP         0000020    /* write permission, grougroup */
385 #endif
386 #ifndef S_IWOTH
387 # define        S_IWOTH         0000002    /* write permission, other */
388 #endif
389
390 /* Under non-UNIX operating systems (MS-DOS, WinNT, MacOS), many filesystem
391    calls take  only one argument; permission is handled very differently on
392    those systems than in Unix.  So we leave such systems a hook on which they
393    can hang their own definitions.  */
394
395 #ifndef CVS_ACCESS
396 # define CVS_ACCESS access
397 #endif
398
399 #ifndef CVS_CHDIR
400 # define CVS_CHDIR chdir
401 #endif
402
403 #ifndef CVS_CREAT
404 # define CVS_CREAT creat
405 #endif
406
407 #ifndef CVS_FOPEN
408 # define CVS_FOPEN fopen
409 #endif
410
411 #ifndef CVS_FDOPEN
412 # define CVS_FDOPEN fdopen
413 #endif
414
415 #ifndef CVS_MKDIR
416 # define CVS_MKDIR mkdir
417 #endif
418
419 #ifndef CVS_OPEN
420 # define CVS_OPEN open
421 #endif
422
423 #ifndef CVS_READDIR
424 # define CVS_READDIR readdir
425 #endif
426
427 #ifndef CVS_CLOSEDIR
428 # define CVS_CLOSEDIR closedir
429 #endif
430
431 #ifndef CVS_OPENDIR
432 # define CVS_OPENDIR opendir
433 #endif
434
435 #ifndef CVS_RENAME
436 # define CVS_RENAME rename
437 #endif
438
439 #ifndef CVS_RMDIR
440 # define CVS_RMDIR rmdir
441 #endif
442
443 #ifndef CVS_STAT
444 /* Use the function from lib/stat.c when the system version is broken.
445  */
446 # ifdef HAVE_STAT_EMPTY_STRING_BUG
447 #   define CVS_STAT rpl_stat
448 # else /* !HAVE_STAT_EMPTY_STRING_BUG */
449 #   define CVS_STAT stat
450 # endif /* HAVE_STAT_EMPTY_STRING_BUG */
451 #endif
452
453 /* Open question: should CVS_STAT be lstat by default?  We need
454    to use lstat in order to handle symbolic links correctly with
455    the PreservePermissions option. -twp */
456 #ifndef CVS_LSTAT
457 /* Use the function from lib/lstat.c when the system version is broken.
458  */
459 # if defined( HAVE_STAT_EMPTY_STRING_BUG ) || !defined( LSTAT_FOLLOWS_SLASHED_SYMLINK )
460 #   define CVS_LSTAT rpl_lstat
461 # else /* !defined(HAVE_STAT_EMPTY_STRING_BUG )
462         *    && defined( LSTAT_FOLLOWS_SLASHED_SYMLINK )
463         */
464 #   define CVS_LSTAT lstat
465 # endif /* defined(HAVE_STAT_EMPTY_STRING_BUG )
466          * || !defined( LSTAT_FOLLOWS_SLASHED_SYMLINK )
467          */
468 #endif
469
470 #ifndef CVS_UNLINK
471 # define CVS_UNLINK unlink
472 #endif
473
474 /* Wildcard matcher.  Should be case-insensitive if the system is.  */
475 #ifndef CVS_FNMATCH
476 # define CVS_FNMATCH fnmatch
477 #endif
478
479 #ifndef HAVE_FSEEKO
480 off_t ftello (FILE *);
481 int fseeko (FILE *, off_t, int);
482 #endif /* HAVE_FSEEKO */
483
484 #ifdef WIN32
485 /*
486  * According to GNU conventions, we should avoid referencing any macro
487  * containing "WIN" as a reference to Microsoft Windows, as we would like to
488  * avoid any implication that we consider Microsoft Windows any sort of "win".
489  *
490  * FIXME: As of 2003-06-09, folks on the GNULIB project were discussing
491  * defining a configure macro to define WOE32 appropriately.  If they ever do
492  * write such a beast, we should use it, though in most cases it would be
493  * preferable to avoid referencing any OS or compiler anyhow, per Autoconf
494  * convention, and reference only tested features of the system.
495  */
496 # define WOE32 1
497 #endif /* WIN32 */
498
499
500
501 #ifdef FILENAMES_CASE_INSENSITIVE
502
503 # if defined (__CYGWIN32__) || defined (WOE32)
504     /* Under Windows, filenames are case-insensitive, and both / and \
505        are path component separators.  */
506 #   define FOLD_FN_CHAR(c) (WNT_filename_classes[(unsigned char) (c)])
507 extern unsigned char WNT_filename_classes[];
508 # else /* ! WOE32 */
509   /* As far as I know, just Macintosh OS X can make it here,
510    * but since the OS X fold just folds a-z into A-Z or visa-versa, I'm just
511    * allowing it to be used for any case insensitive system which we aren't
512    * yet making other specific folds or exceptions for (basically, anything
513    * case insensitive other than Windows, where \ and C:\ style absolute paths
514    * also need to be accounted for).
515    *
516    * Under Mac OS X, filenames are case-insensitive.
517    */
518 #   define FOLD_FN_CHAR(c) (OSX_filename_classes[(unsigned char) (c)])
519 extern unsigned char OSX_filename_classes[];
520 # endif /* __CYGWIN32__ || WOE32 */
521
522 /* The following need to be declared for all case insensitive filesystems.
523  * When not FOLD_FN_CHAR is not #defined, a default definition for these
524  * functions is provided later in this header file.  */
525
526 /* Like strcmp, but with the appropriate tweaks for file names.  */
527 extern int fncmp (const char *n1, const char *n2);
528
529 /* Fold characters in FILENAME to their canonical forms.  */
530 extern void fnfold (char *FILENAME);
531
532 #endif /* FILENAMES_CASE_INSENSITIVE */
533
534
535
536 /* Some file systems are case-insensitive.  If FOLD_FN_CHAR is
537    #defined, it maps the character C onto its "canonical" form.  In a
538    case-insensitive system, it would map all alphanumeric characters
539    to lower case.  Under Windows NT, / and \ are both path component
540    separators, so FOLD_FN_CHAR would map them both to /.  */
541 #ifndef FOLD_FN_CHAR
542 # define FOLD_FN_CHAR(c) (c)
543 # define fnfold(filename) (filename)
544 # define fncmp strcmp
545 #endif
546
547 /* Different file systems can have different naming patterns which designate
548  * a path as absolute.
549  */
550 #ifndef ISABSOLUTE
551 # define ISABSOLUTE(s) ISSLASH(s[FILESYSTEM_PREFIX_LEN(s)])
552 #endif
553
554
555 /* On some systems, we have to be careful about writing/reading files
556    in text or binary mode (so in text mode the system can handle CRLF
557    vs. LF, VMS text file conventions, &c).  We decide to just always
558    be careful.  That way we don't have to worry about whether text and
559    binary differ on this system.  We just have to worry about whether
560    the system has O_BINARY and "rb".  The latter is easy; all ANSI C
561    libraries have it, SunOS4 has it, and CVS has used it unguarded
562    some places for a while now without complaints (e.g. "rb" in
563    server.c (server_updated), since CVS 1.8).  The former is just an
564    #ifdef.  */
565
566 #define FOPEN_BINARY_READ ("rb")
567 #define FOPEN_BINARY_WRITE ("wb")
568 #define FOPEN_BINARY_READWRITE ("r+b")
569
570 #ifdef O_BINARY
571 #define OPEN_BINARY (O_BINARY)
572 #else
573 #define OPEN_BINARY (0)
574 #endif