xref: /vim-8.2.3635/src/os_unix.h (revision 2bf24176)
1 /* vi:set ts=8 sts=4 sw=4:
2  *
3  * VIM - Vi IMproved	by Bram Moolenaar
4  *
5  * Do ":help uganda"  in Vim to read copying and usage conditions.
6  * Do ":help credits" in Vim to see a list of people who contributed.
7  */
8 
9 /*
10  * NextStep has a problem with configure, undefine a few things:
11  */
12 #ifdef NeXT
13 # ifdef HAVE_UTIME
14 #  undef HAVE_UTIME
15 # endif
16 # ifdef HAVE_SYS_UTSNAME_H
17 #  undef HAVE_SYS_UTSNAME_H
18 # endif
19 #endif
20 
21 #include <stdio.h>
22 #include <ctype.h>
23 
24 #ifdef VAXC
25 # include <types.h>
26 # include <stat.h>
27 #else
28 # include <sys/types.h>
29 # include <sys/stat.h>
30 #endif
31 
32 #ifdef HAVE_STDLIB_H
33 # include <stdlib.h>
34 #endif
35 
36 #ifdef __EMX__
37 # define HAVE_TOTAL_MEM
38 #endif
39 
40 #if defined(__CYGWIN__) || defined(__CYGWIN32__)
41 # define WIN32UNIX	/* Compiling for Win32 using Unix files. */
42 # define BINARY_FILE_IO
43 
44 # define CASE_INSENSITIVE_FILENAME
45 # define USE_FNAME_CASE	/* Fix filename case differences. */
46 #endif
47 
48 /* On AIX 4.2 there is a conflicting prototype for ioctl() in stropts.h and
49  * unistd.h.  This hack should fix that (suggested by Jeff George).
50  * But on AIX 4.3 it's alright (suggested by Jake Hamby). */
51 #if defined(FEAT_GUI) && defined(_AIX) && !defined(_AIX43) && !defined(_NO_PROTO)
52 # define _NO_PROTO
53 #endif
54 
55 #ifdef HAVE_UNISTD_H
56 # include <unistd.h>
57 #endif
58 
59 #ifdef HAVE_LIBC_H
60 # include <libc.h>		    /* for NeXT */
61 #endif
62 
63 #ifdef HAVE_SYS_PARAM_H
64 # include <sys/param.h>	    /* defines BSD, if it's a BSD system */
65 #endif
66 
67 /*
68  * Using getcwd() is preferred, because it checks for a buffer overflow.
69  * Don't use getcwd() on systems do use system("sh -c pwd").  There is an
70  * autoconf check for this.
71  * Use getcwd() anyway if getwd() isn't present.
72  */
73 #if defined(HAVE_GETCWD) && !(defined(BAD_GETCWD) && defined(HAVE_GETWD))
74 # define USE_GETCWD
75 #endif
76 
77 #ifndef __ARGS
78     /* The AIX VisualAge cc compiler defines __EXTENDED__ instead of __STDC__
79      * because it includes pre-ansi features. */
80 # if defined(__STDC__) || defined(__GNUC__) || defined(__EXTENDED__)
81 #  define __ARGS(x) x
82 # else
83 #  define __ARGS(x) ()
84 # endif
85 #endif
86 
87 /* always use unlink() to remove files */
88 #ifndef PROTO
89 # ifdef VMS
90 #  define mch_remove(x) delete((char *)(x))
91 #  define vim_mkdir(x, y) mkdir((char *)(x), y)
92 #  ifdef VAX
93 #  else
94 #   define mch_rmdir(x) rmdir((char *)(x))
95 #  endif
96 # else
97 #  define vim_mkdir(x, y) mkdir((char *)(x), y)
98 #  define mch_rmdir(x) rmdir((char *)(x))
99 #  define mch_remove(x) unlink((char *)(x))
100 # endif
101 #endif
102 
103 /* The number of arguments to a signal handler is configured here. */
104 /* It used to be a long list of almost all systems. Any system that doesn't
105  * have an argument??? */
106 #define SIGHASARG
107 
108 /* List 3 arg systems here. I guess __sgi, please test and correct me. jw. */
109 #if defined(__sgi) && defined(HAVE_SIGCONTEXT)
110 # define SIGHAS3ARGS
111 #endif
112 
113 #ifdef SIGHASARG
114 # ifdef SIGHAS3ARGS
115 #  define SIGPROTOARG	(int, int, struct sigcontext *)
116 #  define SIGDEFARG(s)	(s, sig2, scont) int s, sig2; struct sigcontext *scont;
117 #  define SIGDUMMYARG	0, 0, (struct sigcontext *)0
118 # else
119 #  define SIGPROTOARG	(int)
120 #  define SIGDEFARG(s)	(s) int s UNUSED;
121 #  define SIGDUMMYARG	0
122 # endif
123 #else
124 # define SIGPROTOARG   (void)
125 # define SIGDEFARG(s)  ()
126 # define SIGDUMMYARG
127 #endif
128 
129 #ifdef HAVE_DIRENT_H
130 # include <dirent.h>
131 # ifndef NAMLEN
132 #  define NAMLEN(dirent) strlen((dirent)->d_name)
133 # endif
134 #else
135 # define dirent direct
136 # define NAMLEN(dirent) (dirent)->d_namlen
137 # if HAVE_SYS_NDIR_H
138 #  include <sys/ndir.h>
139 # endif
140 # if HAVE_SYS_DIR_H
141 #  include <sys/dir.h>
142 # endif
143 # if HAVE_NDIR_H
144 #  include <ndir.h>
145 # endif
146 #endif
147 
148 #if !defined(HAVE_SYS_TIME_H) || defined(TIME_WITH_SYS_TIME)
149 # include <time.h>	    /* on some systems time.h should not be
150 			       included together with sys/time.h */
151 #endif
152 #ifdef HAVE_SYS_TIME_H
153 # include <sys/time.h>
154 #endif
155 
156 #include <signal.h>
157 
158 #if defined(DIRSIZ) && !defined(MAXNAMLEN)
159 # define MAXNAMLEN DIRSIZ
160 #endif
161 
162 #if defined(UFS_MAXNAMLEN) && !defined(MAXNAMLEN)
163 # define MAXNAMLEN UFS_MAXNAMLEN    /* for dynix/ptx */
164 #endif
165 
166 #if defined(NAME_MAX) && !defined(MAXNAMLEN)
167 # define MAXNAMLEN NAME_MAX	    /* for Linux before .99p3 */
168 #endif
169 
170 /*
171  * Note: if MAXNAMLEN has the wrong value, you will get error messages
172  *	 for not being able to open the swap file.
173  */
174 #if !defined(MAXNAMLEN)
175 # define MAXNAMLEN 512		    /* for all other Unix */
176 #endif
177 
178 #define BASENAMELEN	(MAXNAMLEN - 5)
179 
180 #ifdef HAVE_PWD_H
181 # include <pwd.h>
182 #endif
183 
184 #ifdef __COHERENT__
185 # undef __ARGS
186 #endif
187 
188 #if (defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT)) \
189 	|| (defined(HAVE_SYS_SYSINFO_H) && defined(HAVE_SYSINFO)) \
190 	|| defined(HAVE_SYSCTL) || defined(HAVE_SYSCONF)
191 # define HAVE_TOTAL_MEM
192 #endif
193 
194 
195 #ifndef PROTO
196 
197 #ifdef VMS
198 # include <unixio.h>
199 # include <unixlib.h>
200 # include <signal.h>
201 # include <file.h>
202 # include <ssdef.h>
203 # include <descrip.h>
204 # include <libclidef.h>
205 # include <lnmdef.h>
206 # include <psldef.h>
207 # include <prvdef.h>
208 # include <dvidef.h>
209 # include <dcdef.h>
210 # include <stsdef.h>
211 # include <iodef.h>
212 # include <ttdef.h>
213 # include <tt2def.h>
214 # include <jpidef.h>
215 # include <rms.h>
216 # include <trmdef.h>
217 # include <string.h>
218 # include <starlet.h>
219 # include <socket.h>
220 # include <lib$routines.h>
221 # include <libdef.h>
222 # include <libdtdef.h>
223 
224 # ifdef FEAT_GUI_GTK
225 #  include "gui_gtk_vms.h"
226 # endif
227 #endif
228 
229 #endif /* PROTO */
230 
231 #ifdef VMS
232 typedef struct dsc$descriptor   DESC;
233 #endif
234 
235 /*
236  * Unix system-dependent file names
237  */
238 #ifndef SYS_VIMRC_FILE
239 # define SYS_VIMRC_FILE "$VIM/vimrc"
240 #endif
241 #ifndef SYS_GVIMRC_FILE
242 # define SYS_GVIMRC_FILE "$VIM/gvimrc"
243 #endif
244 #ifndef DFLT_HELPFILE
245 # define DFLT_HELPFILE	"$VIMRUNTIME/doc/help.txt"
246 #endif
247 #ifndef FILETYPE_FILE
248 # define FILETYPE_FILE	"filetype.vim"
249 #endif
250 #ifndef FTPLUGIN_FILE
251 # define FTPLUGIN_FILE	"ftplugin.vim"
252 #endif
253 #ifndef INDENT_FILE
254 # define INDENT_FILE	"indent.vim"
255 #endif
256 #ifndef FTOFF_FILE
257 # define FTOFF_FILE	"ftoff.vim"
258 #endif
259 #ifndef FTPLUGOF_FILE
260 # define FTPLUGOF_FILE	"ftplugof.vim"
261 #endif
262 #ifndef INDOFF_FILE
263 # define INDOFF_FILE	"indoff.vim"
264 #endif
265 #ifndef SYS_MENU_FILE
266 # define SYS_MENU_FILE	"$VIMRUNTIME/menu.vim"
267 #endif
268 
269 #ifndef USR_EXRC_FILE
270 # ifdef VMS
271 #  define USR_EXRC_FILE "sys$login:.exrc"
272 # else
273 #  define USR_EXRC_FILE "$HOME/.exrc"
274 # endif
275 #endif
276 
277 #if !defined(USR_EXRC_FILE2) && defined(VMS)
278 # define USR_EXRC_FILE2 "sys$login:_exrc"
279 #endif
280 
281 #ifndef USR_VIMRC_FILE
282 # ifdef VMS
283 # define USR_VIMRC_FILE  "sys$login:.vimrc"
284 # else
285 #  define USR_VIMRC_FILE "$HOME/.vimrc"
286 # endif
287 #endif
288 
289 
290 #if !defined(USR_VIMRC_FILE2)
291 # ifdef VMS
292 #  define USR_VIMRC_FILE2	"sys$login:vimfiles/vimrc"
293 # else
294 #   define USR_VIMRC_FILE2	"~/.vim/vimrc"
295 # endif
296 #endif
297 
298 #if !defined(USR_VIMRC_FILE3) && defined(VMS)
299 # define USR_VIMRC_FILE3 "sys$login:_vimrc"
300 #endif
301 
302 #ifndef USR_GVIMRC_FILE
303 # ifdef VMS
304 #  define USR_GVIMRC_FILE "sys$login:.gvimrc"
305 # else
306 #  define USR_GVIMRC_FILE "$HOME/.gvimrc"
307 # endif
308 #endif
309 
310 #ifndef USR_GVIMRC_FILE2
311 # ifdef VMS
312 #  define USR_GVIMRC_FILE2	"sys$login:vimfiles/gvimrc"
313 # else
314 #  define USR_GVIMRC_FILE2	"~/.vim/gvimrc"
315 # endif
316 #endif
317 
318 #ifdef VMS
319 # ifndef USR_GVIMRC_FILE3
320 #  define USR_GVIMRC_FILE3  "sys$login:_gvimrc"
321 # endif
322 #endif
323 
324 #ifndef EVIM_FILE
325 # define EVIM_FILE	"$VIMRUNTIME/evim.vim"
326 #endif
327 
328 #ifdef FEAT_VIMINFO
329 # ifndef VIMINFO_FILE
330 #  ifdef VMS
331 #   define VIMINFO_FILE  "sys$login:.viminfo"
332 #  else
333 #   define VIMINFO_FILE "$HOME/.viminfo"
334 #  endif
335 # endif
336 # if !defined(VIMINFO_FILE2) && defined(VMS)
337 #  define VIMINFO_FILE2 "sys$login:_viminfo"
338 # endif
339 #endif
340 
341 #ifndef EXRC_FILE
342 # define EXRC_FILE	".exrc"
343 #endif
344 
345 #ifndef VIMRC_FILE
346 # define VIMRC_FILE	".vimrc"
347 #endif
348 
349 #ifdef FEAT_GUI
350 # ifndef GVIMRC_FILE
351 #  define GVIMRC_FILE	".gvimrc"
352 # endif
353 #endif
354 
355 #ifndef SYNTAX_FNAME
356 # define SYNTAX_FNAME	"$VIMRUNTIME/syntax/%s.vim"
357 #endif
358 
359 #ifndef DFLT_BDIR
360 # ifdef VMS
361 #  define DFLT_BDIR    "./,sys$login:,tmp:"
362 # else
363 #  define DFLT_BDIR    ".,~/tmp,~/"    /* default for 'backupdir' */
364 # endif
365 #endif
366 
367 #ifndef DFLT_DIR
368 # ifdef VMS
369 #  define DFLT_DIR     "./,sys$login:,tmp:"
370 # else
371 #  define DFLT_DIR     ".,~/tmp,/var/tmp,/tmp" /* default for 'directory' */
372 # endif
373 #endif
374 
375 #ifndef DFLT_VDIR
376 # ifdef VMS
377 #  define DFLT_VDIR    "sys$login:vimfiles/view"
378 # else
379 #  define DFLT_VDIR    "$HOME/.vim/view"       /* default for 'viewdir' */
380 # endif
381 #endif
382 
383 #define DFLT_ERRORFILE		"errors.err"
384 
385 #ifdef VMS
386 # define DFLT_RUNTIMEPATH      "sys$login:vimfiles,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,sys$login:vimfiles/after"
387 #else
388 # ifdef RUNTIME_GLOBAL
389 #  define DFLT_RUNTIMEPATH	"~/.vim," RUNTIME_GLOBAL ",$VIMRUNTIME," RUNTIME_GLOBAL "/after,~/.vim/after"
390 # else
391 #  define DFLT_RUNTIMEPATH	"~/.vim,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,~/.vim/after"
392 # endif
393 #endif
394 
395 #ifdef VMS
396 # ifndef VAX
397 #  define VMS_TEMPNAM    /* to fix default .LIS extension */
398 # endif
399 # define TEMPNAME       "TMP:v?XXXXXX.txt"
400 # define TEMPNAMELEN    28
401 #else
402 /* Try several directories to put the temp files. */
403 # define TEMPDIRNAMES  "$TMPDIR", "/tmp", ".", "$HOME"
404 # define TEMPNAMELEN    256
405 #endif
406 
407 /* Special wildcards that need to be handled by the shell */
408 #define SPECIAL_WILDCHAR    "`'{"
409 
410 #ifndef HAVE_OPENDIR
411 # define NO_EXPANDPATH
412 #endif
413 
414 /*
415  * Unix has plenty of memory, use large buffers
416  */
417 #define CMDBUFFSIZE 1024	/* size of the command processing buffer */
418 
419 /* Use the system path length if it makes sense. */
420 #if defined(PATH_MAX) && (PATH_MAX > 1000)
421 # define MAXPATHL	PATH_MAX
422 #else
423 # define MAXPATHL	1024
424 #endif
425 
426 #define CHECK_INODE		/* used when checking if a swap file already
427 				    exists for a file */
428 #ifdef VMS  /* Use less memory because of older systems  */
429 # ifndef DFLT_MAXMEM
430 #  define DFLT_MAXMEM (2*1024)
431 # endif
432 # ifndef DFLT_MAXMEMTOT
433 #  define DFLT_MAXMEMTOT (5*1024)
434 # endif
435 #else
436 # ifndef DFLT_MAXMEM
437 #  define DFLT_MAXMEM	(5*1024)	 /* use up to 5 Mbyte for a buffer */
438 # endif
439 # ifndef DFLT_MAXMEMTOT
440 #  define DFLT_MAXMEMTOT	(10*1024)    /* use up to 10 Mbyte for Vim */
441 # endif
442 #endif
443 
444 /* memmove is not present on all systems, use memmove, bcopy, memcpy or our
445  * own version */
446 /* Some systems have (void *) arguments, some (char *). If we use (char *) it
447  * works for all */
448 #ifdef USEMEMMOVE
449 # define mch_memmove(to, from, len) memmove((char *)(to), (char *)(from), len)
450 #else
451 # ifdef USEBCOPY
452 #  define mch_memmove(to, from, len) bcopy((char *)(from), (char *)(to), len)
453 # else
454 #  ifdef USEMEMCPY
455 #   define mch_memmove(to, from, len) memcpy((char *)(to), (char *)(from), len)
456 #  else
457 #   define VIM_MEMMOVE	    /* found in misc2.c */
458 #  endif
459 # endif
460 #endif
461 
462 #ifndef PROTO
463 # ifdef HAVE_RENAME
464 #  define mch_rename(src, dst) rename(src, dst)
465 # else
466 int mch_rename __ARGS((const char *src, const char *dest));
467 # endif
468 # ifndef VMS
469 #  ifdef __MVS__
470   /* on OS390 Unix getenv() doesn't return a pointer to persistent
471    * storage -> use __getenv() */
472 #   define mch_getenv(x) (char_u *)__getenv((char *)(x))
473 #  else
474 #   define mch_getenv(x) (char_u *)getenv((char *)(x))
475 #  endif
476 #  define mch_setenv(name, val, x) setenv(name, val, x)
477 # endif
478 #endif
479 
480 #if !defined(S_ISDIR) && defined(S_IFDIR)
481 # define	S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
482 #endif
483 #if !defined(S_ISREG) && defined(S_IFREG)
484 # define	S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
485 #endif
486 #if !defined(S_ISBLK) && defined(S_IFBLK)
487 # define	S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
488 #endif
489 #if !defined(S_ISSOCK) && defined(S_IFSOCK)
490 # define	S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
491 #endif
492 #if !defined(S_ISFIFO) && defined(S_IFIFO)
493 # define	S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
494 #endif
495 #if !defined(S_ISCHR) && defined(S_IFCHR)
496 # define	S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
497 #endif
498 
499 /* Note: Some systems need both string.h and strings.h (Savage).  However,
500  * some systems can't handle both, only use string.h in that case. */
501 #ifdef HAVE_STRING_H
502 # include <string.h>
503 #endif
504 #if defined(HAVE_STRINGS_H) && !defined(NO_STRINGS_WITH_STRING_H)
505 # include <strings.h>
506 #endif
507 
508 #if defined(HAVE_SETJMP_H)
509 # include <setjmp.h>
510 # ifdef HAVE_SIGSETJMP
511 #  define JMP_BUF sigjmp_buf
512 #  define SETJMP(x) sigsetjmp((x), 1)
513 #  define LONGJMP siglongjmp
514 # else
515 #  define JMP_BUF jmp_buf
516 #  define SETJMP(x) setjmp(x)
517 #  define LONGJMP longjmp
518 # endif
519 #endif
520 
521 #ifndef HAVE_DUP
522 # define HAVE_DUP		/* have dup() */
523 #endif
524 #define HAVE_ST_MODE		/* have stat.st_mode */
525 
526 /* We have three kinds of ACL support. */
527 #define HAVE_ACL (HAVE_POSIX_ACL || HAVE_SOLARIS_ACL || HAVE_AIX_ACL)
528