update.
[chise/xemacs-chise.git.1] / src / sysfile.h
1 /*
2    Copyright (C) 1995 Free Software Foundation, Inc.
3
4 This file is part of XEmacs.
5
6 XEmacs is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
9 later version.
10
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with XEmacs; see the file COPYING.  If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.  */
20
21 /* Synched up with: Not really in FSF. */
22
23 #ifndef INCLUDED_sysfile_h_
24 #define INCLUDED_sysfile_h_
25
26 #include <errno.h>
27
28 #ifndef WIN32_NATIVE
29 #include <sys/errno.h>          /* <errno.h> does not always imply this */
30 #endif
31
32 #ifdef HAVE_UNISTD_H
33 #include <unistd.h>
34 #endif
35
36 #ifndef INCLUDED_FCNTL
37 # define INCLUDED_FCNTL
38 # include <fcntl.h>
39 #endif /* INCLUDED_FCNTL */
40
41 /* Load sys/types.h if not already loaded.
42    In some systems loading it twice is suicidal.  */
43 #ifndef makedev
44 #include <sys/types.h>          /* some typedefs are used in sys/file.h */
45 #endif
46
47 #ifndef WIN32_NATIVE
48 #include <sys/file.h>
49 #endif
50
51 #include <sys/stat.h>
52
53 #ifndef WIN32_NATIVE
54 /* Some configuration files' definitions for the LOAD_AVE_CVT macro
55    (like sparc.h's) use macros like FSCALE, defined here. */
56 #ifdef HAVE_GTK
57 /* I hate GTK */
58 #undef MIN
59 #undef MAX
60 #endif /* HAVE_GTK */
61 #include <sys/param.h>
62 #endif
63
64 #if defined (NeXT) || defined(CYGWIN)
65 /* what is needed from here?  Do others need it too?
66  O_BINARY is in here under cygwin. */
67 # include <sys/fcntl.h>
68 #endif /* NeXT */
69
70 #ifdef WIN32_NATIVE
71 #include <io.h>
72 #include <direct.h>
73 #endif
74
75 #ifndef STDERR_FILENO
76 #define STDIN_FILENO    0
77 #define STDOUT_FILENO   1
78 #define STDERR_FILENO   2
79 #endif
80
81 #ifndef O_RDONLY
82 #define O_RDONLY 0
83 #endif
84
85 #ifndef O_WRONLY
86 #define O_WRONLY 1
87 #endif
88
89 #ifndef O_RDWR
90 #define O_RDWR 2
91 #endif
92
93 /* file opening defaults */
94 #ifndef OPEN_BINARY
95 #ifdef O_BINARY
96 #define OPEN_BINARY     O_BINARY
97 #else
98 #define OPEN_BINARY     (0)
99 #endif
100 #endif
101
102 #ifndef OPEN_TEXT
103 #ifdef O_TEXT
104 #define OPEN_TEXT       O_TEXT
105 #else
106 #define OPEN_TEXT       (0)
107 #endif
108 #endif
109
110 #ifndef CREAT_MODE
111 #ifdef WIN32_NATIVE
112 #define CREAT_MODE      (S_IREAD | S_IWRITE)
113 #else
114 #define CREAT_MODE      (0666)
115 #endif
116 #endif
117
118 #ifndef READ_TEXT
119 #ifdef O_TEXT
120 #define READ_TEXT "rt"
121 #else
122 #define READ_TEXT "r"
123 #endif
124 #endif
125
126 #ifndef READ_BINARY
127 #ifdef O_BINARY
128 #define READ_BINARY "rb"
129 #else
130 #define READ_BINARY "r"
131 #endif
132 #endif
133
134 #ifndef READ_PLUS_TEXT
135 #ifdef O_TEXT
136 #define READ_PLUS_TEXT "r+t"
137 #else
138 #define READ_PLUS_TEXT "r+"
139 #endif
140 #endif
141
142 #ifndef READ_PLUS_BINARY
143 #ifdef O_BINARY
144 #define READ_PLUS_BINARY "r+b"
145 #else
146 #define READ_PLUS_BINARY "r+"
147 #endif
148 #endif
149
150 #ifndef WRITE_TEXT
151 #ifdef O_TEXT
152 #define WRITE_TEXT "wt"
153 #else
154 #define WRITE_TEXT "w"
155 #endif
156 #endif
157
158 #ifndef WRITE_BINARY
159 #ifdef O_BINARY
160 #define WRITE_BINARY "wb"
161 #else
162 #define WRITE_BINARY "w"
163 #endif
164 #endif
165
166 #ifndef O_NONBLOCK
167 #ifdef O_NDELAY
168 #define O_NONBLOCK O_NDELAY
169 #else
170 #define O_NONBLOCK 04000
171 #endif
172 #endif
173
174 /* if system does not have symbolic links, it does not have lstat.
175    In that case, use ordinary stat instead.  */
176
177 #ifndef S_IFLNK
178 #define lstat xemacs_stat
179 #endif
180
181 #ifndef S_IRUSR
182 # if S_IREAD
183 #  define S_IRUSR S_IREAD
184 # else
185 #  define S_IRUSR 00400
186 # endif
187 #endif
188
189 #ifndef S_IWUSR
190 # if S_IWRITE
191 #  define S_IWUSR S_IWRITE
192 # else
193 #  define S_IWUSR 00200
194 # endif
195 #endif
196
197 #ifndef S_IXUSR
198 # if S_IEXEC
199 #  define S_IXUSR S_IEXEC
200 # else
201 #  define S_IXUSR 00100
202 # endif
203 #endif
204
205 #ifdef STAT_MACROS_BROKEN
206 #undef S_ISBLK
207 #undef S_ISCHR
208 #undef S_ISDIR
209 #undef S_ISFIFO
210 #undef S_ISLNK
211 #undef S_ISMPB
212 #undef S_ISMPC
213 #undef S_ISNWK
214 #undef S_ISREG
215 #undef S_ISSOCK
216 #endif /* STAT_MACROS_BROKEN.  */
217
218 #if !defined(S_ISBLK) && defined(S_IFBLK)
219 #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
220 #endif
221 #if !defined(S_ISCHR) && defined(S_IFCHR)
222 #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
223 #endif
224 #if !defined(S_ISDIR) && defined(S_IFDIR)
225 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
226 #endif
227 #if !defined(S_ISREG) && defined(S_IFREG)
228 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
229 #endif
230 #if !defined(S_ISFIFO) && defined(S_IFIFO)
231 #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
232 #endif
233 #if !defined(S_ISLNK) && defined(S_IFLNK)
234 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
235 #endif
236 #if !defined(S_ISSOCK) && defined(S_IFSOCK)
237 #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
238 #endif
239 #if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */
240 #define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB)
241 #define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC)
242 #endif
243 #if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */
244 #define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK)
245 #endif
246
247 /* Client .c files should simply use `PATH_MAX'. */
248 #ifndef PATH_MAX
249 # if defined (_POSIX_PATH_MAX)
250 #  define PATH_MAX _POSIX_PATH_MAX
251 # elif defined (MAXPATHLEN)
252 #  define PATH_MAX MAXPATHLEN
253 # else
254 #  define PATH_MAX 1024
255 # endif
256 #endif
257
258 /* MAXPATHLEN is deprecated, but, as of this writing, still used. */
259 #ifndef MAXPATHLEN
260 # define MAXPATHLEN 1024
261 #endif
262
263 /* The following definitions are needed under Windows, at least */
264 #ifndef R_OK
265 # define R_OK 4
266 #endif
267
268 /* Under native Windows, there is no concept of execute permission,
269    so redefine execute permissions to be the same as read permission */
270 #ifndef X_OK
271 # ifdef WIN32_NATIVE
272 #  define X_OK R_OK
273 # else
274 #  define X_OK 1
275 # endif
276 #endif
277
278 #ifndef W_OK
279 # define W_OK 2
280 #endif
281
282 #ifndef F_OK
283 # define F_OK 0
284 #endif
285
286 #ifndef FD_CLOEXEC
287 # define FD_CLOEXEC 1
288 #endif
289
290 /* Emacs needs to use its own definitions of certain system calls on
291    some systems (like SunOS 4.1 and USG systems, where the read system
292    call is interruptible but Emacs expects it not to be; and under
293    MULE, where all filenames need to be converted to external format).
294    To do this, we #define read to be sys_read, which is defined in
295    sysdep.c.  We first #undef read, in case some system file defines
296    read as a macro.  sysdep.c doesn't encapsulate read, so the call to
297    read inside of sys_read will do the right thing.
298
299    DONT_ENCAPSULATE is used in files such as sysdep.c that want to
300    call the actual system calls rather than the encapsulated versions.
301    Those files can call sys_read to get the (possibly) encapsulated
302    versions.
303
304    IMPORTANT: the redefinition of the system call must occur *after* the
305    inclusion of any header files that declare or define the system call;
306    otherwise lots of unfriendly things can happen.  This goes for all
307    encapsulated system calls.
308
309    We encapsulate the most common system calls here; we assume their
310    declarations are in one of the standard header files included above.
311    Other encapsulations are declared in the appropriate sys*.h file. */
312
313 #ifdef ENCAPSULATE_READ
314 ssize_t sys_read (int, void *, size_t);
315 #endif
316 #if defined (ENCAPSULATE_READ) && !defined (DONT_ENCAPSULATE)
317 # undef read
318 # define read sys_read
319 #endif
320 #if !defined (ENCAPSULATE_READ) && defined (DONT_ENCAPSULATE)
321 # define sys_read read
322 #endif
323
324 #ifdef ENCAPSULATE_WRITE
325 ssize_t sys_write (int, const void *, size_t);
326 #endif
327 #if defined (ENCAPSULATE_WRITE) && !defined (DONT_ENCAPSULATE)
328 # undef write
329 # define write sys_write
330 #endif
331 #if !defined (ENCAPSULATE_WRITE) && defined (DONT_ENCAPSULATE)
332 # define sys_write write
333 #endif
334
335 #ifdef ENCAPSULATE_OPEN
336 int sys_open (const char *, int, ...);
337 #endif
338 #if defined (ENCAPSULATE_OPEN) && !defined (DONT_ENCAPSULATE)
339 # undef open
340 # define open sys_open
341 #endif
342 #if !defined (ENCAPSULATE_OPEN) && defined (DONT_ENCAPSULATE)
343 # define sys_open open
344 #endif
345
346 #ifdef ENCAPSULATE_CLOSE
347 int sys_close (int);
348 #endif
349 #if defined (ENCAPSULATE_CLOSE) && !defined (DONT_ENCAPSULATE)
350 # undef close
351 # define close sys_close
352 #endif
353 #if !defined (ENCAPSULATE_CLOSE) && defined (DONT_ENCAPSULATE)
354 # define sys_close close
355 #endif
356
357 /* Now the stdio versions ... */
358
359 #ifdef ENCAPSULATE_FREAD
360 size_t sys_fread (void *, size_t, size_t, FILE *);
361 #endif
362 #if defined (ENCAPSULATE_FREAD) && !defined (DONT_ENCAPSULATE)
363 # undef fread
364 # define fread sys_fread
365 #endif
366 #if !defined (ENCAPSULATE_FREAD) && defined (DONT_ENCAPSULATE)
367 # define sys_fread fread
368 #endif
369
370 #ifdef ENCAPSULATE_FWRITE
371 size_t sys_fwrite (const void *, size_t, size_t, FILE *);
372 #endif
373 #if defined (ENCAPSULATE_FWRITE) && !defined (DONT_ENCAPSULATE)
374 # undef fwrite
375 # define fwrite sys_fwrite
376 #endif
377 #if !defined (ENCAPSULATE_FWRITE) && defined (DONT_ENCAPSULATE)
378 # define sys_fwrite fwrite
379 #endif
380
381 #ifdef ENCAPSULATE_FOPEN
382 FILE *sys_fopen (const char *, const char *);
383 #endif
384 #if defined (ENCAPSULATE_FOPEN) && !defined (DONT_ENCAPSULATE)
385 # undef fopen
386 # define fopen sys_fopen
387 #endif
388 #if !defined (ENCAPSULATE_FOPEN) && defined (DONT_ENCAPSULATE)
389 # define sys_fopen fopen
390 #endif
391
392 #ifdef ENCAPSULATE_FCLOSE
393 int sys_fclose (FILE *);
394 #endif
395 #if defined (ENCAPSULATE_FCLOSE) && !defined (DONT_ENCAPSULATE)
396 # undef fclose
397 # define fclose sys_fclose
398 #endif
399 #if !defined (ENCAPSULATE_FCLOSE) && defined (DONT_ENCAPSULATE)
400 # define sys_fclose fclose
401 #endif
402
403
404 /* encapsulations: file-information calls */
405
406 #ifdef ENCAPSULATE_ACCESS
407 int sys_access (const char *path, int mode);
408 #endif
409 #if defined (ENCAPSULATE_ACCESS) && !defined (DONT_ENCAPSULATE)
410 # undef access
411 # define access sys_access
412 #endif
413 #if !defined (ENCAPSULATE_ACCESS) && defined (DONT_ENCAPSULATE)
414 # define sys_access access
415 #endif
416
417 #ifdef ENCAPSULATE_EACCESS
418 int sys_eaccess (const char *path, int mode);
419 #endif
420 #if defined (ENCAPSULATE_EACCESS) && !defined (DONT_ENCAPSULATE)
421 # undef eaccess
422 # define eaccess sys_eaccess
423 #endif
424 #if !defined (ENCAPSULATE_EACCESS) && defined (DONT_ENCAPSULATE)
425 # define sys_eaccess eaccess
426 #endif
427
428 #ifdef ENCAPSULATE_LSTAT
429 int sys_lstat (const char *path, struct stat *buf);
430 #endif
431 #if defined (ENCAPSULATE_LSTAT) && !defined (DONT_ENCAPSULATE)
432 # undef lstat
433 # define lstat sys_lstat
434 #endif
435 #if !defined (ENCAPSULATE_LSTAT) && defined (DONT_ENCAPSULATE)
436 # define sys_lstat lstat
437 #endif
438
439 #ifdef ENCAPSULATE_READLINK
440 int sys_readlink (const char *path, char *buf, size_t bufsiz);
441 #endif
442 #if defined (ENCAPSULATE_READLINK) && !defined (DONT_ENCAPSULATE)
443 # undef readlink
444 # define readlink sys_readlink
445 #endif
446 #if !defined (ENCAPSULATE_READLINK) && defined (DONT_ENCAPSULATE)
447 # define sys_readlink readlink
448 #endif
449
450 #ifdef ENCAPSULATE_FSTAT
451 int sys_fstat (int fd, struct stat *buf);
452 #endif
453 #if defined (ENCAPSULATE_FSTAT) && !defined (DONT_ENCAPSULATE)
454 # undef fstat
455 # define fstat sys_fstat
456 #endif
457 #if !defined (ENCAPSULATE_FSTAT) && defined (DONT_ENCAPSULATE)
458 # define sys_fstat fstat
459 #endif
460
461 int xemacs_stat (const char *path, struct stat *buf);
462
463 /* encapsulations: file-manipulation calls */
464
465 #ifdef ENCAPSULATE_CHMOD
466 int sys_chmod (const char *path, mode_t mode);
467 #endif
468 #if defined (ENCAPSULATE_CHMOD) && !defined (DONT_ENCAPSULATE)
469 # undef chmod
470 # define chmod sys_chmod
471 #endif
472 #if !defined (ENCAPSULATE_CHMOD) && defined (DONT_ENCAPSULATE)
473 # define sys_chmod chmod
474 #endif
475
476 #ifdef ENCAPSULATE_CREAT
477 int sys_creat (const char *path, mode_t mode);
478 #endif
479 #if defined (ENCAPSULATE_CREAT) && !defined (DONT_ENCAPSULATE)
480 # undef creat
481 # define creat sys_creat
482 #endif
483 #if !defined (ENCAPSULATE_CREAT) && defined (DONT_ENCAPSULATE)
484 # define sys_creat creat
485 #endif
486
487 #ifdef ENCAPSULATE_LINK
488 int sys_link (const char *existing, const char *new);
489 #endif
490 #if defined (ENCAPSULATE_LINK) && !defined (DONT_ENCAPSULATE)
491 # undef link
492 # define link sys_link
493 #endif
494 #if !defined (ENCAPSULATE_LINK) && defined (DONT_ENCAPSULATE)
495 # define sys_link link
496 #endif
497
498 #ifdef ENCAPSULATE_RENAME
499 int sys_rename (const char *old, const char *new);
500 #endif
501 #if defined (ENCAPSULATE_RENAME) && !defined (DONT_ENCAPSULATE)
502 # undef rename
503 # define rename sys_rename
504 #endif
505 #if !defined (ENCAPSULATE_RENAME) && defined (DONT_ENCAPSULATE)
506 # define sys_rename rename
507 #endif
508
509 #ifdef ENCAPSULATE_SYMLINK
510 int sys_symlink (const char *name1, const char *name2);
511 #endif
512 #if defined (ENCAPSULATE_SYMLINK) && !defined (DONT_ENCAPSULATE)
513 # undef symlink
514 # define symlink sys_symlink
515 #endif
516 #if !defined (ENCAPSULATE_SYMLINK) && defined (DONT_ENCAPSULATE)
517 # define sys_symlink symlink
518 #endif
519
520 #ifdef ENCAPSULATE_UNLINK
521 int sys_unlink (const char *path);
522 #endif
523 #if defined (ENCAPSULATE_UNLINK) && !defined (DONT_ENCAPSULATE)
524 # undef unlink
525 # define unlink sys_unlink
526 #endif
527 #if !defined (ENCAPSULATE_UNLINK) && defined (DONT_ENCAPSULATE)
528 # define sys_unlink unlink
529 #endif
530
531 #ifdef ENCAPSULATE_EXECVP
532 int sys_execvp (const char *, char * const *);
533 #endif
534 #if defined (ENCAPSULATE_EXECVP) && !defined (DONT_ENCAPSULATE)
535 # undef execvp
536 # define execvp sys_execvp
537 #endif
538 #if !defined (ENCAPSULATE_EXECVP) && defined (DONT_ENCAPSULATE)
539 # define sys_execvp execvp
540 #endif
541
542 #endif /* INCLUDED_sysfile_h_ */