diff options
Diffstat (limited to 'src/os_unix.h')
-rw-r--r-- | src/os_unix.h | 531 |
1 files changed, 531 insertions, 0 deletions
diff --git a/src/os_unix.h b/src/os_unix.h new file mode 100644 index 000000000..b78b23e7b --- /dev/null +++ b/src/os_unix.h @@ -0,0 +1,531 @@ +/* vi:set ts=8 sts=4 sw=4: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + */ + +/* + * NextStep has a problem with configure, undefine a few things: + */ +#ifdef NeXT +# ifdef HAVE_UTIME +# undef HAVE_UTIME +# endif +# ifdef HAVE_SYS_UTSNAME_H +# undef HAVE_SYS_UTSNAME_H +# endif +#endif + +#include <stdio.h> +#include <ctype.h> + +#ifdef VAXC +# include <types.h> +# include <stat.h> +#else +# include <sys/types.h> +# include <sys/stat.h> +#endif + +#ifdef HAVE_STDLIB_H +# include <stdlib.h> +#endif + +#ifdef __EMX__ +# define HAVE_TOTAL_MEM +#endif + +#if defined(__CYGWIN__) || defined(__CYGWIN32__) +# define WIN32UNIX /* Compiling for Win32 using Unix files. */ +# define BINARY_FILE_IO +#endif + +/* On AIX 4.2 there is a conflicting prototype for ioctl() in stropts.h and + * unistd.h. This hack should fix that (suggested by Jeff George). + * But on AIX 4.3 it's alright (suggested by Jake Hamby). */ +#if defined(FEAT_GUI) && defined(_AIX) && !defined(_AIX43) && !defined(_NO_PROTO) +# define _NO_PROTO +#endif + +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif + +#ifdef HAVE_LIBC_H +# include <libc.h> /* for NeXT */ +#endif + +#ifdef HAVE_SYS_PARAM_H +# include <sys/param.h> /* defines BSD, if it's a BSD system */ +#endif + +/* + * Sun defines FILE on SunOS 4.x.x, Solaris has a typedef for FILE + */ +#if defined(sun) && !defined(FILE) +# define SOLARIS +#endif + +/* + * Using getcwd() is preferred, because it checks for a buffer overflow. + * Don't use getcwd() on systems do use system("sh -c pwd"). There is an + * autoconf check for this. + * Use getcwd() anyway if getwd() isn't present. + */ +#if defined(HAVE_GETCWD) && !(defined(BAD_GETCWD) && defined(HAVE_GETWD)) +# define USE_GETCWD +#endif + +#ifndef __ARGS + /* The AIX VisualAge cc compiler defines __EXTENDED__ instead of __STDC__ + * because it includes pre-ansi features. */ +# if defined(__STDC__) || defined(__GNUC__) || defined(__EXTENDED__) +# define __ARGS(x) x +# else +# define __ARGS(x) () +# endif +#endif + +/* always use unlink() to remove files */ +#ifndef PROTO +# ifdef VMS +# define mch_remove(x) delete((char *)(x)) +# define vim_mkdir(x, y) mkdir((char *)(x), y) +# ifdef VAX +# else +# define mch_rmdir(x) rmdir((char *)(x)) +# endif +# else +# define vim_mkdir(x, y) mkdir((char *)(x), y) +# define mch_rmdir(x) rmdir((char *)(x)) +# define mch_remove(x) unlink((char *)(x)) +# endif +#endif + +/* The number of arguments to a signal handler is configured here. */ +/* It used to be a long list of almost all systems. Any system that doesn't + * have an argument??? */ +#define SIGHASARG + +/* List 3 arg systems here. I guess __sgi, please test and correct me. jw. */ +#if defined(__sgi) && defined(HAVE_SIGCONTEXT) +# define SIGHAS3ARGS +#endif + +#ifdef SIGHASARG +# ifdef SIGHAS3ARGS +# define SIGPROTOARG (int, int, struct sigcontext *) +# define SIGDEFARG(s) (s, sig2, scont) int s, sig2; struct sigcontext *scont; +# define SIGDUMMYARG 0, 0, (struct sigcontext *)0 +# else +# define SIGPROTOARG (int) +# define SIGDEFARG(s) (s) int s; +# define SIGDUMMYARG 0 +# endif +#else +# define SIGPROTOARG (void) +# define SIGDEFARG(s) () +# define SIGDUMMYARG +#endif + +#ifdef HAVE_DIRENT_H +# include <dirent.h> +# ifndef NAMLEN +# define NAMLEN(dirent) strlen((dirent)->d_name) +# endif +#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 + +#if !defined(HAVE_SYS_TIME_H) || defined(TIME_WITH_SYS_TIME) +# include <time.h> /* on some systems time.h should not be + included together with sys/time.h */ +#endif +#ifdef HAVE_SYS_TIME_H +# include <sys/time.h> +#endif + +#include <signal.h> + +#if defined(DIRSIZ) && !defined(MAXNAMLEN) +# define MAXNAMLEN DIRSIZ +#endif + +#if defined(UFS_MAXNAMLEN) && !defined(MAXNAMLEN) +# define MAXNAMLEN UFS_MAXNAMLEN /* for dynix/ptx */ +#endif + +#if defined(NAME_MAX) && !defined(MAXNAMLEN) +# define MAXNAMLEN NAME_MAX /* for Linux before .99p3 */ +#endif + +/* + * Note: if MAXNAMLEN has the wrong value, you will get error messages + * for not being able to open the swap file. + */ +#if !defined(MAXNAMLEN) +# define MAXNAMLEN 512 /* for all other Unix */ +#endif + +#define BASENAMELEN (MAXNAMLEN - 5) + +#ifdef HAVE_ERRNO_H +# include <errno.h> +#endif + +#ifdef HAVE_PWD_H +# include <pwd.h> +#endif + +#ifdef __COHERENT__ +# undef __ARGS +#endif + +#if (defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT)) \ + || (defined(HAVE_SYS_SYSINFO_H) && defined(HAVE_SYSINFO)) \ + || defined(HAVE_SYSCTL) || defined(HAVE_SYSCONF) +# define HAVE_TOTAL_MEM +#endif + +#ifdef VMS +#include <unixio.h> +#include <unixlib.h> +#include <signal.h> +#include <file.h> +#include <ssdef.h> +#include <descrip.h> +#include <libclidef.h> +#include <lnmdef.h> +#include <psldef.h> +#include <prvdef.h> +#include <dvidef.h> +#include <dcdef.h> +#include <stsdef.h> +#include <iodef.h> +#include <ttdef.h> +#include <tt2def.h> +#include <jpidef.h> +#include <rms.h> +#include <trmdef.h> +#include <string.h> +#include <starlet.h> +#include <socket.h> +#include <lib$routines.h> + +typedef struct dsc$descriptor DESC; +#endif + +/* + * Unix system-dependent file names + */ +#ifndef SYS_VIMRC_FILE +# define SYS_VIMRC_FILE "$VIM/vimrc" +#endif +#ifndef SYS_GVIMRC_FILE +# define SYS_GVIMRC_FILE "$VIM/gvimrc" +#endif +#ifndef DFLT_HELPFILE +# define DFLT_HELPFILE "$VIMRUNTIME/doc/help.txt" +#endif +#ifndef FILETYPE_FILE +# define FILETYPE_FILE "filetype.vim" +#endif +#ifndef FTPLUGIN_FILE +# define FTPLUGIN_FILE "ftplugin.vim" +#endif +#ifndef INDENT_FILE +# define INDENT_FILE "indent.vim" +#endif +#ifndef FTOFF_FILE +# define FTOFF_FILE "ftoff.vim" +#endif +#ifndef FTPLUGOF_FILE +# define FTPLUGOF_FILE "ftplugof.vim" +#endif +#ifndef INDOFF_FILE +# define INDOFF_FILE "indoff.vim" +#endif +#ifndef SYS_MENU_FILE +# define SYS_MENU_FILE "$VIMRUNTIME/menu.vim" +#endif + +#ifndef USR_EXRC_FILE +# ifdef VMS +# define USR_EXRC_FILE "sys$login:.exrc" +# else +# define USR_EXRC_FILE "$HOME/.exrc" +# endif +#endif + +#if !defined(USR_EXRC_FILE2) && defined(OS2) +# define USR_EXRC_FILE2 "$VIM/.exrc" +#endif +#if !defined(USR_EXRC_FILE2) && defined(VMS) +# define USR_EXRC_FILE2 "sys$login:_exrc" +#endif + +#ifndef USR_VIMRC_FILE +# ifdef VMS +# define USR_VIMRC_FILE "sys$login:.vimrc" +# else +# define USR_VIMRC_FILE "$HOME/.vimrc" +# endif +#endif + +#if !defined(USR_VIMRC_FILE2) && defined(OS2) +# define USR_VIMRC_FILE2 "$VIM/.vimrc" +#endif +#if !defined(USR_VIMRC_FILE2) && defined(VMS) +# define USR_VIMRC_FILE2 "sys$login:_vimrc" +#endif + +#ifndef USR_GVIMRC_FILE +# ifdef VMS +# define USR_GVIMRC_FILE "sys$login:.gvimrc" +# else +# define USR_GVIMRC_FILE "$HOME/.gvimrc" +# endif +#endif + +#ifdef VMS +# ifndef USR_GVIMRC_FILE2 +# define USR_GVIMRC_FILE2 "sys$login:_gvimrc" +# endif +#endif + +#ifndef EVIM_FILE +# define EVIM_FILE "$VIMRUNTIME/evim.vim" +#endif + +#ifdef FEAT_VIMINFO +# ifndef VIMINFO_FILE +# ifdef VMS +# define VIMINFO_FILE "sys$login:.viminfo" +# else +# define VIMINFO_FILE "$HOME/.viminfo" +# endif +# endif +# if !defined(VIMINFO_FILE2) && defined(OS2) +# define VIMINFO_FILE2 "$VIM/.viminfo" +# endif +# if !defined(VIMINFO_FILE2) && defined(VMS) +# define VIMINFO_FILE2 "sys$login:_viminfo" +# endif +#endif + +#ifndef EXRC_FILE +# define EXRC_FILE ".exrc" +#endif + +#ifndef VIMRC_FILE +# define VIMRC_FILE ".vimrc" +#endif + +#ifdef FEAT_GUI +# ifndef GVIMRC_FILE +# define GVIMRC_FILE ".gvimrc" +# endif +#endif + +#ifndef SYNTAX_FNAME +# define SYNTAX_FNAME "$VIMRUNTIME/syntax/%s.vim" +#endif + +#ifndef DFLT_BDIR +# ifdef OS2 +# define DFLT_BDIR ".,c:/tmp,~/tmp,~/" +# else +# ifdef VMS +# define DFLT_BDIR "./,sys$login:,tmp:" +# else +# define DFLT_BDIR ".,~/tmp,~/" /* default for 'backupdir' */ +# endif +# endif +#endif + +#ifndef DFLT_DIR +# ifdef OS2 +# define DFLT_DIR ".,~/tmp,c:/tmp,/tmp" +# else +# ifdef VMS +# define DFLT_DIR "./,sys$login:,tmp:" +# else +# define DFLT_DIR ".,~/tmp,/var/tmp,/tmp" /* default for 'directory' */ +# endif +# endif +#endif + +#ifndef DFLT_VDIR +# ifdef OS2 +# define DFLT_VDIR "$VIM/vimfiles/view" +# else +# ifdef VMS +# define DFLT_VDIR "sys$login:vimfiles/view" +# else +# define DFLT_VDIR "$HOME/.vim/view" /* default for 'viewdir' */ +# endif +# endif +#endif + +#define DFLT_ERRORFILE "errors.err" + +#ifdef OS2 +# define DFLT_RUNTIMEPATH "$HOME/vimfiles,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,$HOME/vimfiles/after" +#else +# ifdef VMS +# define DFLT_RUNTIMEPATH "sys$login:vimfiles,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,sys$login:vimfiles/after" +# else +# ifdef RUNTIME_GLOBAL +# define DFLT_RUNTIMEPATH "~/.vim," RUNTIME_GLOBAL ",$VIMRUNTIME," RUNTIME_GLOBAL "/after,~/.vim/after" +# else +# define DFLT_RUNTIMEPATH "~/.vim,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,~/.vim/after" +# endif +# endif +#endif + +#ifdef OS2 +/* + * Try several directories to put the temp files. + */ +# define TEMPDIRNAMES "$TMP", "$TEMP", "c:\\TMP", "c:\\TEMP", "" +# define TEMPNAMELEN 128 +#else +# ifdef VMS +# ifndef VAX +# define VMS_TEMPNAM /* to fix default .LIS extension */ +# endif +# define TEMPNAME "TMP:v?XXXXXX.txt" +# define TEMPNAMELEN 28 +# else +# define TEMPDIRNAMES "$TMPDIR", "/tmp", ".", "$HOME" +# define TEMPNAMELEN 256 +# endif +#endif + +/* Special wildcards that need to be handled by the shell */ +#define SPECIAL_WILDCHAR "`'{" + +#ifndef HAVE_OPENDIR +# define NO_EXPANDPATH +#endif + +/* + * Unix has plenty of memory, use large buffers + */ +#define CMDBUFFSIZE 1024 /* size of the command processing buffer */ +#define MAXPATHL 1024 /* Unix has long paths and plenty of memory */ + +#define CHECK_INODE /* used when checking if a swap file already + exists for a file */ +#ifdef VMS /* Use less memory because of older systems */ +# ifndef DFLT_MAXMEM +# define DFLT_MAXMEM (2*1024) +# endif +# ifndef DFLT_MAXMEMTOT +# define DFLT_MAXMEMTOT (5*1024) +# endif +#else +# ifndef DFLT_MAXMEM +# define DFLT_MAXMEM (5*1024) /* use up to 5 Mbyte for a buffer */ +# endif +# ifndef DFLT_MAXMEMTOT +# define DFLT_MAXMEMTOT (10*1024) /* use up to 10 Mbyte for Vim */ +# endif +#endif + +/* memmove is not present on all systems, use memmove, bcopy, memcpy or our + * own version */ +/* Some systems have (void *) arguments, some (char *). If we use (char *) it + * works for all */ +#ifdef USEMEMMOVE +# define mch_memmove(to, from, len) memmove((char *)(to), (char *)(from), len) +#else +# ifdef USEBCOPY +# define mch_memmove(to, from, len) bcopy((char *)(from), (char *)(to), len) +# else +# ifdef USEMEMCPY +# define mch_memmove(to, from, len) memcpy((char *)(to), (char *)(from), len) +# else +# define VIM_MEMMOVE /* found in misc2.c */ +# endif +# endif +#endif + +#ifndef PROTO +# ifdef HAVE_RENAME +# define mch_rename(src, dst) rename(src, dst) +# else +int mch_rename __ARGS((const char *src, const char *dest)); +# endif +# ifdef VMS +# define mch_chdir(s) chdir(vms_fixfilename(s)) +# else +# define mch_chdir(s) chdir(s) +# endif +# ifndef VMS +# ifdef __MVS__ + /* on OS390 Unix getenv() doesn't return a pointer to persistant + * storage -> use __getenv() */ +# define mch_getenv(x) (char_u *)__getenv((char *)(x)) +# else +# define mch_getenv(x) (char_u *)getenv((char *)(x)) +# endif +# define mch_setenv(name, val, x) setenv(name, val, x) +# endif +#endif + +#if !defined(S_ISDIR) && defined(S_IFDIR) +# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#endif +#if !defined(S_ISREG) && defined(S_IFREG) +# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#endif +#if !defined(S_ISBLK) && defined(S_IFBLK) +# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) +#endif +#if !defined(S_ISSOCK) && defined(S_IFSOCK) +# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) +#endif +#if !defined(S_ISFIFO) && defined(S_IFIFO) +# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) +#endif + +/* Note: Some systems need both string.h and strings.h (Savage). However, + * some systems can't handle both, only use string.h in that case. */ +#ifdef HAVE_STRING_H +# include <string.h> +#endif +#if defined(HAVE_STRINGS_H) && !defined(NO_STRINGS_WITH_STRING_H) +# include <strings.h> +#endif + +#if defined(HAVE_SETJMP_H) +# include <setjmp.h> +# ifdef HAVE_SIGSETJMP +# define JMP_BUF sigjmp_buf +# define SETJMP(x) sigsetjmp((x), 1) +# define LONGJMP siglongjmp +# else +# define JMP_BUF jmp_buf +# define SETJMP(x) setjmp(x) +# define LONGJMP longjmp +# endif +#endif + +#define HAVE_DUP /* have dup() */ +#define HAVE_ST_MODE /* have stat.st_mode */ + +/* We have three kinds of ACL support. */ +#define HAVE_ACL (HAVE_POSIX_ACL || HAVE_SOLARIS_ACL || HAVE_AIX_ACL) |