]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/cvs/lib/system.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / cvs / 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 #include <sys/types.h>
15 #include <sys/stat.h>
16
17 #ifdef STAT_MACROS_BROKEN
18 #undef S_ISBLK
19 #undef S_ISCHR
20 #undef S_ISDIR
21 #undef S_ISREG
22 #undef S_ISFIFO
23 #undef S_ISLNK
24 #undef S_ISSOCK
25 #undef S_ISMPB
26 #undef S_ISMPC
27 #undef S_ISNWK
28 #endif
29
30 /* Not all systems have S_IFMT, but we want to use it if we have it.
31    The S_IFMT code below looks right (it masks and compares).  The
32    non-S_IFMT code looks bogus (are there really systems on which
33    S_IFBLK, S_IFLNK, &c, each have their own bit?  I suspect it was
34    written for OS/2 using the IBM C/C++ Tools 2.01 compiler).
35
36    Of course POSIX systems will have S_IS*, so maybe the issue is
37    semi-moot.  */
38
39 #if !defined(S_ISBLK) && defined(S_IFBLK)
40 # if defined(S_IFMT)
41 # define        S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
42 # else
43 # define S_ISBLK(m) ((m) & S_IFBLK)
44 # endif
45 #endif
46
47 #if !defined(S_ISCHR) && defined(S_IFCHR)
48 # if defined(S_IFMT)
49 # define        S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
50 # else
51 # define S_ISCHR(m) ((m) & S_IFCHR)
52 # endif
53 #endif
54
55 #if !defined(S_ISDIR) && defined(S_IFDIR)
56 # if defined(S_IFMT)
57 # define        S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
58 # else
59 # define S_ISDIR(m) ((m) & S_IFDIR)
60 # endif
61 #endif
62
63 #if !defined(S_ISREG) && defined(S_IFREG)
64 # if defined(S_IFMT)
65 # define        S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
66 # else
67 # define S_ISREG(m) ((m) & S_IFREG)
68 # endif
69 #endif
70
71 #if !defined(S_ISFIFO) && defined(S_IFIFO)
72 # if defined(S_IFMT)
73 # define        S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
74 # else
75 # define S_ISFIFO(m) ((m) & S_IFIFO)
76 # endif
77 #endif
78
79 #if !defined(S_ISLNK) && defined(S_IFLNK)
80 # if defined(S_IFMT)
81 # define        S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
82 # else
83 # define S_ISLNK(m) ((m) & S_IFLNK)
84 # endif
85 #endif
86
87 #ifndef S_ISSOCK
88 # if defined( S_IFSOCK )
89 #   ifdef S_IFMT
90 #     define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
91 #   else
92 #     define S_ISSOCK(m) ((m) & S_IFSOCK)
93 #   endif /* S_IFMT */
94 # elif defined( S_ISNAM )
95     /* SCO OpenServer 5.0.6a */
96 #   define S_ISSOCK S_ISNAM
97 # endif /* !S_IFSOCK && S_ISNAM */
98 #endif /* !S_ISSOCK */
99
100 #if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */
101 # if defined(S_IFMT)
102 # define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
103 # define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
104 # else
105 # define S_ISMPB(m) ((m) & S_IFMPB)
106 # define S_ISMPC(m) ((m) & S_IFMPC)
107 # endif
108 #endif
109
110 #if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */
111 # if defined(S_IFMT)
112 # define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
113 # else
114 # define S_ISNWK(m) ((m) & S_IFNWK)
115 # endif
116 #endif
117
118 #ifdef NEED_DECOY_PERMISSIONS        /* OS/2, really */
119
120 #define S_IRUSR S_IREAD
121 #define S_IWUSR S_IWRITE
122 #define S_IXUSR S_IEXEC
123 #define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
124 #define S_IRGRP S_IREAD
125 #define S_IWGRP S_IWRITE
126 #define S_IXGRP S_IEXEC
127 #define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
128 #define S_IROTH S_IREAD
129 #define S_IWOTH S_IWRITE
130 #define S_IXOTH S_IEXEC
131 #define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
132
133 #else /* ! NEED_DECOY_PERMISSIONS */
134
135 #ifndef S_IRUSR
136 #define S_IRUSR 0400
137 #define S_IWUSR 0200
138 #define S_IXUSR 0100
139 /* Read, write, and execute by owner.  */
140 #define S_IRWXU (S_IRUSR|S_IWUSR|S_IXUSR)
141
142 #define S_IRGRP (S_IRUSR >> 3)  /* Read by group.  */
143 #define S_IWGRP (S_IWUSR >> 3)  /* Write by group.  */
144 #define S_IXGRP (S_IXUSR >> 3)  /* Execute by group.  */
145 /* Read, write, and execute by group.  */
146 #define S_IRWXG (S_IRWXU >> 3)
147
148 #define S_IROTH (S_IRGRP >> 3)  /* Read by others.  */
149 #define S_IWOTH (S_IWGRP >> 3)  /* Write by others.  */
150 #define S_IXOTH (S_IXGRP >> 3)  /* Execute by others.  */
151 /* Read, write, and execute by others.  */
152 #define S_IRWXO (S_IRWXG >> 3)
153 #endif /* !def S_IRUSR */
154 #endif /* NEED_DECOY_PERMISSIONS */
155
156 #if defined(POSIX) || defined(HAVE_UNISTD_H)
157 #include <unistd.h>
158 #include <limits.h>
159 #else
160 off_t lseek ();
161 char *getcwd ();
162 #endif
163
164 #include "xtime.h"
165
166 #ifdef HAVE_IO_H
167 #include <io.h>
168 #endif
169
170 #ifdef HAVE_DIRECT_H
171 #include <direct.h>
172 #endif
173
174
175
176 /*
177 **  MAXPATHLEN and PATH_MAX
178 **
179 **     On most systems MAXPATHLEN is defined in sys/param.h to be 1024. Of
180 **     those that this is not true, again most define PATH_MAX in limits.h
181 **     or sys/limits.h which usually gets included by limits.h. On the few
182 **     remaining systems that neither statement is true, _POSIX_PATH_MAX 
183 **     is defined.
184 **
185 **     So:
186 **         1. If PATH_MAX is defined just use it.
187 **         2. If MAXPATHLEN is defined but not PATH_MAX, then define
188 **            PATH_MAX in terms of MAXPATHLEN.
189 **         3. If neither is defined, include limits.h and check for
190 **            PATH_MAX again.
191 **         3.1 If we now have PATHSIZE, define PATH_MAX in terms of that.
192 **             and ignore the rest.  Since _POSIX_PATH_MAX (checked for
193 **             next) is the *most* restrictive (smallest) value, if we
194 **             trust _POSIX_PATH_MAX, several of our buffers are too small.
195 **         4. If PATH_MAX is still not defined but _POSIX_PATH_MAX is,
196 **            then define PATH_MAX in terms of _POSIX_PATH_MAX.
197 **         5. And if even _POSIX_PATH_MAX doesn't exist just put in
198 **            a reasonable value.
199 **         *. All in all, this is an excellent argument for using pathconf()
200 **            when at all possible.  Or better yet, dynamically allocate
201 **            our buffers and use getcwd() not getwd().
202 **
203 **     This works on:
204 **         Sun Sparc 10        SunOS 4.1.3  &  Solaris 1.2
205 **         HP 9000/700         HP/UX 8.07   &  HP/UX 9.01
206 **         Tektronix XD88/10   UTekV 3.2e
207 **         IBM RS6000          AIX 3.2
208 **         Dec Alpha           OSF 1 ????
209 **         Intel 386           BSDI BSD/386
210 **         Intel 386           SCO OpenServer Release 5
211 **         Apollo              Domain 10.4
212 **         NEC                 SVR4
213 */
214
215 /* On MOST systems this will get you MAXPATHLEN.
216    Windows NT doesn't have this file, tho.  */
217 #ifdef HAVE_SYS_PARAM_H
218 #include <sys/param.h>
219 #endif
220
221 #ifndef PATH_MAX  
222 #  ifdef MAXPATHLEN
223 #    define PATH_MAX                 MAXPATHLEN
224 #  else
225 #    include <limits.h>
226 #    ifndef PATH_MAX
227 #      ifdef PATHSIZE
228 #         define PATH_MAX               PATHSIZE
229 #      else /* no PATHSIZE */
230 #        ifdef _POSIX_PATH_MAX
231 #          define PATH_MAX             _POSIX_PATH_MAX
232 #        else
233 #          define PATH_MAX             1024
234 #        endif  /* no _POSIX_PATH_MAX */
235 #      endif  /* no PATHSIZE */
236 #    endif /* no PATH_MAX   */
237 #  endif  /* MAXPATHLEN */
238 #endif  /* PATH_MAX   */
239
240
241 /* The NeXT (without _POSIX_SOURCE, which we don't want) has a utime.h
242    which doesn't define anything.  It would be cleaner to have configure
243    check for struct utimbuf, but for now I'm checking NeXT here (so I don't
244    have to debug the configure check across all the machines).  */
245 #if defined (HAVE_UTIME_H) && !defined (NeXT)
246 #  include <utime.h>
247 #else
248 #  if defined (HAVE_SYS_UTIME_H)
249 #    include <sys/utime.h>
250 #  else
251 #    ifndef ALTOS
252 struct utimbuf
253 {
254   long actime;
255   long modtime;
256 };
257 #    endif
258 int utime ();
259 #  endif
260 #endif
261
262 #include <string.h>
263
264 #ifndef ERRNO_H_MISSING
265 #include <errno.h>
266 #endif
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
291 #ifdef STDC_HEADERS
292 # include <stdlib.h>
293 #else
294 char *getenv ();
295 char *malloc ();
296 char *realloc ();
297 char *calloc ();
298 extern int errno;
299 #endif
300
301 /* SunOS4 apparently does not define this in stdlib.h.  */
302 #ifndef EXIT_FAILURE
303 # define EXIT_FAILURE 1
304 #endif
305
306 /* check for POSIX signals */
307 #if defined(HAVE_SIGACTION) && defined(HAVE_SIGPROCMASK)
308 # define POSIX_SIGNALS
309 #endif
310
311 /* MINIX 1.6 doesn't properly support sigaction */
312 #if defined(_MINIX)
313 # undef POSIX_SIGNALS
314 #endif
315
316 /* If !POSIX, try for BSD.. Reason: 4.4BSD implements these as wrappers */
317 #if !defined(POSIX_SIGNALS)
318 # if defined(HAVE_SIGVEC) && defined(HAVE_SIGSETMASK) && defined(HAVE_SIGBLOCK)
319 #  define BSD_SIGNALS
320 # endif
321 #endif
322
323 /* Under OS/2, this must be included _after_ stdio.h; that's why we do
324    it here. */
325 #ifdef USE_OWN_TCPIP_H
326 # include "tcpip.h"
327 #endif
328
329 #ifdef HAVE_FCNTL_H
330 # include <fcntl.h>
331 #else
332 # include <sys/file.h>
333 #endif
334
335 #ifndef SEEK_SET
336 # define SEEK_SET 0
337 # define SEEK_CUR 1
338 # define SEEK_END 2
339 #endif
340
341 #ifndef F_OK
342 # define F_OK 0
343 # define X_OK 1
344 # define W_OK 2
345 # define R_OK 4
346 #endif
347
348 #if HAVE_DIRENT_H
349 # include <dirent.h>
350 # define NAMLEN(dirent) strlen((dirent)->d_name)
351 #else
352 # define dirent direct
353 # define NAMLEN(dirent) (dirent)->d_namlen
354 # if HAVE_SYS_NDIR_H
355 #  include <sys/ndir.h>
356 # endif
357 # if HAVE_SYS_DIR_H
358 #  include <sys/dir.h>
359 # endif
360 # if HAVE_NDIR_H
361 #  include <ndir.h>
362 # endif
363 #endif
364
365 /* Convert B 512-byte blocks to kilobytes if K is nonzero,
366    otherwise return it unchanged. */
367 #define convert_blocks(b, k) ((k) ? ((b) + 1) / 2 : (b))
368
369 #ifndef S_ISLNK
370 # define lstat stat
371 #endif
372
373 /*
374  * Some UNIX distributions don't include these in their stat.h Defined here
375  * because "config.h" is always included last.
376  */
377 #ifndef S_IWRITE
378 # define        S_IWRITE        0000200    /* write permission, owner */
379 #endif
380 #ifndef S_IWGRP
381 # define        S_IWGRP         0000020    /* write permission, grougroup */
382 #endif
383 #ifndef S_IWOTH
384 # define        S_IWOTH         0000002    /* write permission, other */
385 #endif
386
387 /* Under non-UNIX operating systems (MS-DOS, WinNT, MacOS), many filesystem
388    calls take  only one argument; permission is handled very differently on
389    those systems than in Unix.  So we leave such systems a hook on which they
390    can hang their own definitions.  */
391
392 #ifndef CVS_ACCESS
393 # define CVS_ACCESS access
394 #endif
395
396 #ifndef CVS_CHDIR
397 # define CVS_CHDIR chdir
398 #endif
399
400 #ifndef CVS_CREAT
401 # define CVS_CREAT creat
402 #endif
403
404 #ifndef CVS_FOPEN
405 # define CVS_FOPEN fopen
406 #endif
407
408 #ifndef CVS_FDOPEN
409 # define CVS_FDOPEN fdopen
410 #endif
411
412 #ifndef CVS_MKDIR
413 # define CVS_MKDIR mkdir
414 #endif
415
416 #ifndef CVS_OPEN
417 # define CVS_OPEN open
418 #endif
419
420 #ifndef CVS_READDIR
421 # define CVS_READDIR readdir
422 #endif
423
424 #ifndef CVS_CLOSEDIR
425 # define CVS_CLOSEDIR closedir
426 #endif
427
428 #ifndef CVS_OPENDIR
429 # define CVS_OPENDIR opendir
430 #endif
431
432 #ifndef CVS_RENAME
433 # define CVS_RENAME rename
434 #endif
435
436 #ifndef CVS_RMDIR
437 # define CVS_RMDIR rmdir
438 #endif
439
440 #ifndef CVS_STAT
441 # define CVS_STAT stat
442 #endif
443
444 /* Open question: should CVS_STAT be lstat by default?  We need
445    to use lstat in order to handle symbolic links correctly with
446    the PreservePermissions option. -twp */
447 #ifndef CVS_LSTAT
448 # define CVS_LSTAT lstat
449 #endif
450
451 #ifndef CVS_UNLINK
452 # define CVS_UNLINK unlink
453 #endif
454
455 /* Wildcard matcher.  Should be case-insensitive if the system is.  */
456 #ifndef CVS_FNMATCH
457 # define CVS_FNMATCH fnmatch
458 #endif
459
460 #ifdef WIN32
461 /*
462  * According to GNU conventions, we should avoid referencing any macro
463  * containing "WIN" as a reference to Microsoft Windows, as we would like to
464  * avoid any implication that we consider Microsoft Windows any sort of "win".
465  *
466  * FIXME: As of 2003-06-09, folks on the GNULIB project were discussing
467  * defining a configure macro to define WOE32 appropriately.  If they ever do
468  * write such a beast, we should use it, though in most cases it would be
469  * preferable to avoid referencing any OS or compiler anyhow, per Autoconf
470  * convention, and reference only tested features of the system.
471  */
472 # define WOE32 1
473 #endif /* WIN32 */
474
475
476 #ifdef WOE32
477   /* Under Windows NT, filenames are case-insensitive.  */
478 # define FILENAMES_CASE_INSENSITIVE 1
479 #endif /* WOE32 */
480
481
482
483 #ifdef FILENAMES_CASE_INSENSITIVE
484
485 # if defined (__CYGWIN32__) || defined (WOE32)
486     /* Under Windows, filenames are case-insensitive, and both / and \
487        are path component separators.  */
488 #   define FOLD_FN_CHAR(c) (WNT_filename_classes[(unsigned char) (c)])
489 extern unsigned char WNT_filename_classes[];
490     /* Is the character C a path name separator?  Under
491        Windows NT, you can use either / or \.  */
492 #   define ISDIRSEP(c) (FOLD_FN_CHAR(c) == '/')
493 #   define ISABSOLUTE(s) (ISDIRSEP(s[0]) || FOLD_FN_CHAR(s[0]) >= 'a' && FOLD_FN_CHAR(s[0]) <= 'z' && s[1] == ':' && ISDIRSEP(s[2]))
494 # else /* !__CYGWIN32__ && !WOE32 */
495   /* As far as I know, only Macintosh OS X & VMS make it here, but any
496    * platform defining FILENAMES_CASE_INSENSITIVE which isn't WOE32 or
497    * piggy-backing the same could, in theory.  Since the OS X fold just folds
498    * A-Z into a-z, I'm just allowing it to be used for any case insensitive
499    * system which we aren't yet making other specific folds or exceptions for.
500    * WOE32 needs its own class since \ and C:\ style absolute paths also need
501    * to be accounted for.
502    */
503 #  if defined(USE_VMS_FILENAMES)
504 #   define FOLD_FN_CHAR(c) (VMS_filename_classes[(unsigned char) (c)])
505 extern unsigned char VMS_filename_classes[];
506 #  else
507 #   define FOLD_FN_CHAR(c) (OSX_filename_classes[(unsigned char) (c)])
508 extern unsigned char OSX_filename_classes[];
509 #  endif
510 # endif /* __CYGWIN32__ || WOE32 */
511
512 /* The following need to be declared for all case insensitive filesystems.
513  * When not FOLD_FN_CHAR is not #defined, a default definition for these
514  * functions is provided later in this header file.  */
515
516 /* Like strcmp, but with the appropriate tweaks for file names.  */
517 extern int fncmp (const char *n1, const char *n2);
518
519 /* Fold characters in FILENAME to their canonical forms.  */
520 extern void fnfold (char *FILENAME);
521
522 #endif /* FILENAMES_CASE_INSENSITIVE */
523
524
525
526 /* Some file systems are case-insensitive.  If FOLD_FN_CHAR is
527    #defined, it maps the character C onto its "canonical" form.  In a
528    case-insensitive system, it would map all alphanumeric characters
529    to lower case.  Under Windows NT, / and \ are both path component
530    separators, so FOLD_FN_CHAR would map them both to /.  */
531 #ifndef FOLD_FN_CHAR
532 # define FOLD_FN_CHAR(c) (c)
533 # define fnfold(filename) (filename)
534 # define fncmp strcmp
535 #endif
536
537 /* Different file systems have different path component separators.
538    For the VMS port we might need to abstract further back than this.  */
539 #ifndef ISDIRSEP
540 # define ISDIRSEP(c) ((c) == '/')
541 #endif
542
543 /* Different file systems can have different naming patterns which designate
544  * a path as absolute
545  */
546 #ifndef ISABSOLUTE
547 # define ISABSOLUTE(s) ISDIRSEP(s[0])
548 #endif
549
550
551 /* On some systems, we have to be careful about writing/reading files
552    in text or binary mode (so in text mode the system can handle CRLF
553    vs. LF, VMS text file conventions, &c).  We decide to just always
554    be careful.  That way we don't have to worry about whether text and
555    binary differ on this system.  We just have to worry about whether
556    the system has O_BINARY and "rb".  The latter is easy; all ANSI C
557    libraries have it, SunOS4 has it, and CVS has used it unguarded
558    some places for a while now without complaints (e.g. "rb" in
559    server.c (server_updated), since CVS 1.8).  The former is just an
560    #ifdef.  */
561
562 #define FOPEN_BINARY_READ ("rb")
563 #define FOPEN_BINARY_WRITE ("wb")
564 #define FOPEN_BINARY_READWRITE ("r+b")
565
566 #ifdef O_BINARY
567 #define OPEN_BINARY (O_BINARY)
568 #else
569 #define OPEN_BINARY (0)
570 #endif