summaryrefslogtreecommitdiff
path: root/lib/system.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/system.h')
-rw-r--r--lib/system.h349
1 files changed, 349 insertions, 0 deletions
diff --git a/lib/system.h b/lib/system.h
new file mode 100644
index 0000000..8ea4a95
--- /dev/null
+++ b/lib/system.h
@@ -0,0 +1,349 @@
+/* system-dependent definitions for CVS.
+ Copyright (C) 1989-1992 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details. */
+
+/***
+ *** Begin the default set of autoconf includes.
+ ***/
+
+/* Headers assumed for C89 freestanding compilers. See HACKING for more. */
+#include <limits.h>
+#include <stdarg.h>
+#include <stddef.h>
+
+/* C89 hosted headers assumed since they were included in UNIX version 7.
+ * See HACKING for more.
+ */
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+
+/* C89 hosted headers we _think_ GCC supplies even on freestanding systems.
+ * If we find any systems which do not have them, a replacement header should
+ * be discussed with the GNULIB folks.
+ *
+ * For more information, please see the `Portability' section of the `HACKING'
+ * file.
+ */
+#include <stdlib.h>
+#include <string.h>
+
+/* We assume this because it has been around forever despite not being a part
+ * of any of the other standards we assume conformance to. So far this hasn't
+ * been a problem.
+ *
+ * For more information, please see the `Portability' section of the `HACKING'
+ * file.
+ */
+#include <sys/types.h>
+
+/* A GNULIB replacement for this C99 header is supplied when it is missing.
+ * See the comments in stdbool_.h for its limitations.
+ */
+#include <stdbool.h>
+
+/* Ditto for these POSIX.2 headers. */
+#include <fnmatch.h>
+#include <getopt.h> /* Has GNU extensions, */
+
+/* We assume <sys/stat.h> because GNULIB does. */
+#include <sys/stat.h>
+
+#if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+#endif /* !STDC_HEADERS && HAVE_MEMORY_H */
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else /* ! HAVE_INTTYPES_H */
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif /* HAVE_STDINT_H */
+#endif /* HAVE_INTTYPES_H */
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+/* End the default set of autoconf includes */
+
+/* Assume these headers. */
+#include <pwd.h>
+
+/* There is a replacement stub for gettext provided by GNULIB when gettext is
+ * not available.
+ */
+#include <gettext.h>
+
+#ifndef DEVNULL
+# define DEVNULL "/dev/null"
+#endif
+
+#ifdef HAVE_IO_H
+#include <io.h>
+#endif
+
+#ifdef HAVE_DIRECT_H
+#include <direct.h>
+#endif
+
+/* The NeXT (without _POSIX_SOURCE, which we don't want) has a utime.h
+ which doesn't define anything. It would be cleaner to have configure
+ check for struct utimbuf, but for now I'm checking NeXT here (so I don't
+ have to debug the configure check across all the machines). */
+#if defined (HAVE_UTIME_H) && !defined (NeXT)
+# include <utime.h>
+#else
+# if defined (HAVE_SYS_UTIME_H)
+# include <sys/utime.h>
+# else
+# ifndef ALTOS
+struct utimbuf
+{
+ long actime;
+ long modtime;
+};
+# endif
+int utime ();
+# endif
+#endif
+
+/* errno.h variations:
+ *
+ * Not all systems set the same error code on a non-existent-file
+ * error. This tries to ask the question somewhat portably.
+ * On systems that don't have ENOTEXIST, this should behave just like
+ * x == ENOENT. "x" is probably errno, of course.
+ */
+#ifdef ENOTEXIST
+# ifdef EOS2ERR
+# define existence_error(x) \
+ (((x) == ENOTEXIST) || ((x) == ENOENT) || ((x) == EOS2ERR))
+# else
+# define existence_error(x) \
+ (((x) == ENOTEXIST) || ((x) == ENOENT))
+# endif
+#else
+# ifdef EVMSERR
+# define existence_error(x) \
+((x) == ENOENT || (x) == EINVAL || (x) == EVMSERR)
+# else
+# define existence_error(x) ((x) == ENOENT)
+# endif
+#endif
+
+/* check for POSIX signals */
+#if defined(HAVE_SIGACTION) && defined(HAVE_SIGPROCMASK)
+# define POSIX_SIGNALS
+#endif
+
+/* MINIX 1.6 doesn't properly support sigaction */
+#if defined(_MINIX)
+# undef POSIX_SIGNALS
+#endif
+
+/* If !POSIX, try for BSD.. Reason: 4.4BSD implements these as wrappers */
+#if !defined(POSIX_SIGNALS)
+# if defined(HAVE_SIGVEC) && defined(HAVE_SIGSETMASK) && defined(HAVE_SIGBLOCK)
+# define BSD_SIGNALS
+# endif
+#endif
+
+/* Under OS/2, this must be included _after_ stdio.h; that's why we do
+ it here. */
+#ifdef USE_OWN_TCPIP_H
+# include "tcpip.h"
+#endif
+
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#else
+# include <sys/file.h>
+#endif
+
+#ifndef SEEK_SET
+# define SEEK_SET 0
+# define SEEK_CUR 1
+# define SEEK_END 2
+#endif
+
+#ifndef F_OK
+# define F_OK 0
+# define X_OK 1
+# define W_OK 2
+# define R_OK 4
+#endif
+
+#if HAVE_DIRENT_H
+# include <dirent.h>
+# define NAMLEN(dirent) strlen((dirent)->d_name)
+#else
+# define dirent direct
+# define NAMLEN(dirent) (dirent)->d_namlen
+# if HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+# endif
+# if HAVE_SYS_DIR_H
+# include <sys/dir.h>
+# endif
+# if HAVE_NDIR_H
+# include <ndir.h>
+# endif
+#endif
+
+/* Convert B 512-byte blocks to kilobytes if K is nonzero,
+ otherwise return it unchanged. */
+#define convert_blocks(b, k) ((k) ? ((b) + 1) / 2 : (b))
+
+/* Under non-UNIX operating systems (MS-DOS, WinNT, MacOS), many filesystem
+ calls take only one argument; permission is handled very differently on
+ those systems than in Unix. So we leave such systems a hook on which they
+ can hang their own definitions. */
+
+#ifndef CVS_ACCESS
+# define CVS_ACCESS access
+#endif
+
+#ifndef CVS_CHDIR
+# define CVS_CHDIR chdir
+#endif
+
+#ifndef CVS_CREAT
+# define CVS_CREAT creat
+#endif
+
+#ifndef CVS_FOPEN
+# define CVS_FOPEN fopen
+#endif
+
+#ifndef CVS_FDOPEN
+# define CVS_FDOPEN fdopen
+#endif
+
+#ifndef CVS_MKDIR
+# define CVS_MKDIR mkdir
+#endif
+
+#ifndef CVS_OPEN
+# define CVS_OPEN open
+#endif
+
+#ifndef CVS_READDIR
+# define CVS_READDIR readdir
+#endif
+
+#ifndef CVS_CLOSEDIR
+# define CVS_CLOSEDIR closedir
+#endif
+
+#ifndef CVS_OPENDIR
+# define CVS_OPENDIR opendir
+#endif
+
+#ifndef CVS_RENAME
+# define CVS_RENAME rename
+#endif
+
+#ifndef CVS_RMDIR
+# define CVS_RMDIR rmdir
+#endif
+
+#ifndef CVS_UNLINK
+# define CVS_UNLINK unlink
+#endif
+
+/* Wildcard matcher. Should be case-insensitive if the system is. */
+#ifndef CVS_FNMATCH
+# define CVS_FNMATCH fnmatch
+#endif
+
+#ifndef HAVE_FSEEKO
+off_t ftello (FILE *);
+int fseeko (FILE *, off_t, int);
+#endif /* HAVE_FSEEKO */
+
+#ifdef FILENAMES_CASE_INSENSITIVE
+
+# if defined (__CYGWIN32__) || defined (WOE32)
+ /* Under Windows, filenames are case-insensitive, and both / and \
+ are path component separators. */
+# define FOLD_FN_CHAR(c) (WNT_filename_classes[(unsigned char) (c)])
+extern unsigned char WNT_filename_classes[];
+# else /* !__CYGWIN32__ && !WOE32 */
+ /* As far as I know, only Macintosh OS X & VMS make it here, but any
+ * platform defining FILENAMES_CASE_INSENSITIVE which isn't WOE32 or
+ * piggy-backing the same could, in theory. Since the OS X fold just folds
+ * A-Z into a-z, I'm just allowing it to be used for any case insensitive
+ * system which we aren't yet making other specific folds or exceptions for.
+ * WOE32 needs its own class since \ and C:\ style absolute paths also need
+ * to be accounted for.
+ */
+# define FOLD_FN_CHAR(c) (OSX_filename_classes[(unsigned char) (c)])
+extern unsigned char OSX_filename_classes[];
+# endif /* __CYGWIN32__ || WOE32 */
+
+/* The following need to be declared for all case insensitive filesystems.
+ * When not FOLD_FN_CHAR is not #defined, a default definition for these
+ * functions is provided later in this header file. */
+
+/* Like strcmp, but with the appropriate tweaks for file names. */
+extern int fncmp (const char *n1, const char *n2);
+
+/* Fold characters in FILENAME to their canonical forms. */
+extern void fnfold (char *FILENAME);
+
+#endif /* FILENAMES_CASE_INSENSITIVE */
+
+
+
+/* Some file systems are case-insensitive. If FOLD_FN_CHAR is
+ #defined, it maps the character C onto its "canonical" form. In a
+ case-insensitive system, it would map all alphanumeric characters
+ to lower case. Under Windows NT, / and \ are both path component
+ separators, so FOLD_FN_CHAR would map them both to /. */
+#ifndef FOLD_FN_CHAR
+# define FOLD_FN_CHAR(c) (c)
+# define fnfold(filename) (filename)
+# define fncmp strcmp
+#endif
+
+/* Different file systems can have different naming patterns which designate
+ * a path as absolute.
+ */
+#ifndef ISABSOLUTE
+# define ISABSOLUTE(s) ISSLASH(s[FILE_SYSTEM_PREFIX_LEN(s)])
+#endif
+
+
+/* On some systems, we have to be careful about writing/reading files
+ in text or binary mode (so in text mode the system can handle CRLF
+ vs. LF, VMS text file conventions, &c). We decide to just always
+ be careful. That way we don't have to worry about whether text and
+ binary differ on this system. We just have to worry about whether
+ the system has O_BINARY and "rb". The latter is easy; all ANSI C
+ libraries have it, SunOS4 has it, and CVS has used it unguarded
+ some places for a while now without complaints (e.g. "rb" in
+ server.c (server_updated), since CVS 1.8). The former is just an
+ #ifdef. */
+
+#define FOPEN_BINARY_READ ("rb")
+#define FOPEN_BINARY_WRITE ("wb")
+#define FOPEN_BINARY_READWRITE ("r+b")
+
+#ifdef O_BINARY
+#define OPEN_BINARY (O_BINARY)
+#else
+#define OPEN_BINARY (0)
+#endif
+
+#ifndef fd_select
+# define fd_select select
+#endif