Import a stripped down cvs-1.12.13
[dragonfly.git] / contrib / cvs-1.12 / 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 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