1 /*  Copyright 1996-1999,2001,2002,2007-2009 Alain Knaff.
2  *  This file is part of mtools.
3  *
4  *  Mtools 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 3 of the License, or
7  *  (at your option) any later version.
8  *
9  *  Mtools 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  *  You should have received a copy of the GNU General Public License
15  *  along with Mtools.  If not, see <http://www.gnu.org/licenses/>.
16  *
17  * System includes for mtools
18  */
19 
20 #ifndef SYSINCLUDES_H
21 #define SYSINCLUDES_H
22 
23 #define _LARGEFILE64_SOURCE
24 #define _GNU_SOURCE
25 
26 #include "config.h"
27 
28 
29 /* OS/2 needs __inline__, but for some reason is not autodetected */
30 #ifdef __EMX__
31 # ifndef inline
32 #  define inline __inline__
33 # endif
34 #endif
35 
36 /***********************************************************************/
37 /*                                                                     */
38 /* OS dependencies which cannot be covered by the autoconfigure script */
39 /*                                                                     */
40 /***********************************************************************/
41 
42 
43 #ifdef OS_aux
44 /* A/UX needs POSIX_SOURCE, just as AIX does. Unlike SCO and AIX, it seems
45  * to prefer TERMIO over TERMIOS */
46 #ifndef _POSIX_SOURCE
47 # define _POSIX_SOURCE
48 #endif
49 #ifndef POSIX_SOURCE
50 # define POSIX_SOURCE
51 #endif
52 
53 #endif
54 
55 
56 /* On AIX, we have to prefer strings.h, as string.h lacks a prototype
57  * for strcasecmp. On most other architectures, it's string.h which seems
58  * to be more complete */
59 #if (defined OS_aix && defined HAVE_STRINGS_H)
60 # undef HAVE_STRING_H
61 #endif
62 
63 
64 #ifdef OS_ultrix
65 /* on ultrix, if termios present, prefer it instead of termio */
66 # ifdef HAVE_TERMIOS_H
67 #  undef HAVE_TERMIO_H
68 # endif
69 #endif
70 
71 #ifdef OS_linux_gnu
72 /* RMS strikes again */
73 # ifndef OS_linux
74 #  define OS_linux
75 # endif
76 #endif
77 
78 /* For compiling with MingW, use the following configure line
79 
80 ac_cv_func_setpgrp_void=yes ../mtools/configure --build=i386-linux-gnu --host=i386-mingw32 --disable-floppyd --without-x --disable-raw-term --srcdir ../mtools
81 
82  */
83 #ifdef OS_mingw32
84 #ifndef OS_mingw32msvc
85 #define OS_mingw32msvc
86 #endif
87 #endif
88 
89 #ifndef HAVE_CADDR_T
90 typedef void *caddr_t;
91 #endif
92 
93 
94 /***********************************************************************/
95 /*                                                                     */
96 /* Compiler dependencies                                               */
97 /*                                                                     */
98 /***********************************************************************/
99 
100 
101 #if defined __GNUC__ && defined __STDC__
102 /* gcc -traditional doesn't have PACKED, UNUSED and NORETURN */
103 # define PACKED __attribute__ ((packed))
104 # if __GNUC__ == 2 && __GNUC_MINOR__ > 6 || __GNUC__ >= 3
105 /* gcc 2.6.3 doesn't have "unused" */		/* mool */
106 #  define UNUSED(x) x __attribute__ ((unused));x
107 #  define UNUSEDP __attribute__ ((unused))
108 # endif
109 # define NORETURN __attribute__ ((noreturn))
110 # if __GNUC__ >= 8
111 #  define NONULLTERM __attribute__ ((nonstring))
112 # endif
113 #endif
114 
115 #ifndef UNUSED
116 # define UNUSED(x) x
117 # define UNUSEDP /* */
118 #endif
119 
120 #ifndef PACKED
121 # define PACKED /* */
122 #endif
123 
124 #ifndef NORETURN
125 # define NORETURN /* */
126 #endif
127 
128 #ifndef NONULLTERM
129 # define NONULLTERM /* */
130 #endif
131 
132 /***********************************************************************/
133 /*                                                                     */
134 /* Include files                                                       */
135 /*                                                                     */
136 /***********************************************************************/
137 
138 #define _LARGEFILE64_SOURCE
139 #define _GNU_SOURCE
140 
141 
142 #ifdef HAVE_FEATURES_H
143 # include <features.h>
144 #endif
145 
146 
147 #include <sys/types.h>
148 
149 #ifdef HAVE_STDINT_H
150 # include <stdint.h>
151 #endif
152 
153 #ifdef HAVE_INTTYPES_H
154 # include <inttypes.h>
155 #endif
156 
157 #ifdef HAVE_STDLIB_H
158 # include <stdlib.h>
159 #endif
160 
161 #include <stdio.h>
162 #include <ctype.h>
163 
164 #ifdef HAVE_UNISTD_H
165 # include <unistd.h>
166 #endif
167 
168 #ifdef HAVE_LINUX_UNISTD_H
169 # include <linux/unistd.h>
170 #endif
171 
172 #ifdef HAVE_LIBC_H
173 # include <libc.h>
174 #endif
175 
176 #ifdef HAVE_GETOPT_H
177 # include <getopt.h>
178 #endif
179 
180 #ifdef HAVE_FCNTL_H
181 # include <fcntl.h>
182 #endif
183 
184 #ifdef HAVE_LIMITS_H
185 # include <limits.h>
186 #endif
187 
188 #ifdef HAVE_SYS_FILE_H
189 # include <sys/file.h>
190 #endif
191 
192 #ifdef HAVE_SYS_IOCTL_H
193 # ifndef sunos
194 # include <sys/ioctl.h>
195 #endif
196 #endif
197 /* if we don't have sys/ioctl.h, we rely on unistd to supply a prototype
198  * for it. If it doesn't, we'll only get a (harmless) warning. The idea
199  * is to get mtools compile on as many platforms as possible, but to not
200  * suppress warnings if the platform is broken, as long as these warnings do
201  * not prevent compilation */
202 
203 #ifdef TIME_WITH_SYS_TIME
204 # include <sys/time.h>
205 # include <time.h>
206 #else
207 # ifdef HAVE_SYS_TIME_H
208 #  include <sys/time.h>
209 # else
210 #  include <time.h>
211 # endif
212 #endif
213 
214 #ifndef NO_TERMIO
215 # ifdef HAVE_TERMIO_H
216 #  include <termio.h>
217 # elif defined HAVE_SYS_TERMIO_H
218 #  include <sys/termio.h>
219 # endif
220 # if !defined OS_ultrix || !(defined HAVE_TERMIO_H || defined HAVE_TERMIO_H)
221 /* on Ultrix, avoid double inclusion of both termio and termios */
222 #  ifdef HAVE_TERMIOS_H
223 #   include <termios.h>
224 #  elif defined HAVE_SYS_TERMIOS_H
225 #   include <sys/termios.h>
226 #  endif
227 # endif
228 # ifdef HAVE_STTY_H
229 #  include <sgtty.h>
230 # endif
231 #endif
232 
233 
234 #if defined(OS_aux) && !defined(_SYSV_SOURCE)
235 /* compiled in POSIX mode, this is left out unless SYSV */
236 #define	NCC	8
237 struct termio {
238 	unsigned short	c_iflag;	/* input modes */
239 	unsigned short	c_oflag;	/* output modes */
240 	unsigned short	c_cflag;	/* control modes */
241 	unsigned short	c_lflag;	/* line discipline modes */
242 	char	c_line;			/* line discipline */
243 	unsigned char	c_cc[NCC];	/* control chars */
244 };
245 extern int ioctl(int fildes, int request, void *arg);
246 #endif
247 
248 
249 #ifdef HAVE_MNTENT_H
250 # include <mntent.h>
251 #endif
252 
253 #ifdef HAVE_SYS_PARAM_H
254 # include <sys/param.h>
255 #endif
256 
257 /* Can only be done here, as BSD is defined in sys/param.h :-( */
258 #if defined BSD || defined __BEOS__
259 /* on BSD and on BEOS, we prefer gettimeofday, ... */
260 # ifdef HAVE_GETTIMEOFDAY
261 #  undef HAVE_TZSET
262 # endif
263 #else /* BSD */
264 /* ... elsewhere we prefer tzset */
265 # ifdef HAVE_TZSET
266 #  undef HAVE_GETTIMEOFDAY
267 # endif
268 #endif
269 
270 
271 #include <sys/stat.h>
272 
273 #include <errno.h>
274 #ifndef errno
275 extern int errno;
276 #endif
277 
278 #ifndef OS_mingw32msvc
279 #include <pwd.h>
280 #endif
281 
282 
283 #ifdef HAVE_STRING_H
284 # include <string.h>
285 #else
286 # ifdef HAVE_STRINGS_H
287 #  include <strings.h>
288 # endif
289 #endif
290 
291 #ifdef HAVE_MEMORY_H
292 # include <memory.h>
293 #endif
294 
295 #ifdef HAVE_MALLOC_H
296 # include <malloc.h>
297 #endif
298 
299 #ifdef HAVE_IO_H
300 # include <io.h>
301 #endif
302 
303 #ifdef HAVE_SIGNAL_H
304 # include <signal.h>
305 #else
306 # ifdef HAVE_SYS_SIGNAL_H
307 #  include <sys/signal.h>
308 # endif
309 #endif
310 
311 #ifdef HAVE_UTIME_H
312 # include <utime.h>
313 #endif
314 
315 #ifdef HAVE_SYS_WAIT_H
316 # ifndef DONT_NEED_WAIT
317 #  include <sys/wait.h>
318 # endif
319 #endif
320 
321 #ifdef HAVE_WCHAR_H
322 # include <wchar.h>
323 # ifndef HAVE_PUTWC
324 #  define putwc(c,f) fprintf((f),"%lc",(c))
325 # endif
326 #else
327 # define wcscmp strcmp
328 # define wcscasecmp strcasecmp
329 # define wcsdup strdup
330 # define wcslen strlen
331 # define wcschr strchr
332 # define wcspbrk strpbrk
333 # define wchar_t char
334 # define putwc putc
335 #endif
336 
337 #ifdef HAVE_WCTYPE_H
338 # include <wctype.h>
339 #else
340 # define towupper(x) toupper(x)
341 # define towlower(x) tolower(x)
342 # define iswupper(x) isupper(x)
343 # define iswlower(x) islower(x)
344 # define iswcntrl(x) iscntrl(x)
345 #endif
346 
347 #ifdef HAVE_LOCALE_H
348 # include <locale.h>
349 #endif
350 
351 #ifdef HAVE_XLOCALE_H
352 # include <xlocale.h>
353 #endif
354 
355 #ifdef USE_FLOPPYD
356 
357 #ifdef HAVE_SYS_SOCKET_H
358 #include <sys/socket.h>
359 #endif
360 
361 #ifdef HAVE_NETINET_IN_H
362 #include <netinet/in.h>
363 #endif
364 
365 #ifdef HAVE_NETINET_TCP_H
366 #include <netinet/tcp.h>
367 #endif
368 
369 #ifdef HAVE_ARPA_INET_H
370 #include <arpa/inet.h>
371 #endif
372 
373 #ifdef HAVE_NETDB_H
374 #include <netdb.h>
375 #endif
376 
377 #ifdef HAVE_X11_XAUTH_H
378 #include <X11/Xauth.h>
379 #endif
380 
381 #ifdef HAVE_X11_XLIB_H
382 #include <X11/Xlib.h>
383 #endif
384 
385 #endif
386 
387 #ifndef INADDR_NONE
388 #define INADDR_NONE (-1)
389 #endif
390 
391 
392 #ifdef sgi
393 #define MSGIHACK __EXTENSIONS__
394 #undef __EXTENSIONS__
395 #endif
396 #include <math.h>
397 #ifdef sgi
398 #define __EXTENSIONS__ MSGIHACK
399 #undef MSGIHACK
400 #endif
401 
402 /* missing functions */
403 #ifndef HAVE_SRANDOM
404 # ifdef OS_mingw32msvc
405 #  define srandom srand
406 # else
407 #  define srandom srand48
408 # endif
409 #endif
410 
411 #ifndef HAVE_RANDOM
412 # ifdef OS_mingw32msvc
413 #  define random (long)rand
414 # else
415 #  define random (long)lrand48
416 # endif
417 #endif
418 
419 #ifndef HAVE_STRCHR
420 # define strchr index
421 #endif
422 
423 #ifndef HAVE_STRRCHR
424 # define strrchr rindex
425 #endif
426 
427 
428 #ifndef HAVE_STRDUP
429 extern char *strdup(const char *str);
430 #endif /* HAVE_STRDUP */
431 
432 #ifndef HAVE_STRNDUP
433 extern char *strndup(const char *s, size_t n);
434 #endif /* HAVE_STRDUP */
435 
436 #ifndef HAVE_MEMCPY
437 extern char *memcpy(char *s1, const char *s2, size_t n);
438 #endif
439 
440 #ifndef HAVE_MEMSET
441 extern char *memset(char *s, char c, size_t n);
442 #endif /* HAVE_MEMSET */
443 
444 
445 #ifndef HAVE_STRPBRK
446 extern char *strpbrk(const char *string, const char *brkset);
447 #endif /* HAVE_STRPBRK */
448 
449 
450 #ifndef HAVE_STRTOUL
451 unsigned long strtoul(const char *string, char **eptr, int base);
452 #endif /* HAVE_STRTOUL */
453 
454 #ifndef HAVE_STRSPN
455 size_t strspn(const char *s, const char *accept);
456 #endif /* HAVE_STRSPN */
457 
458 #ifndef HAVE_STRCSPN
459 size_t strcspn(const char *s, const char *reject);
460 #endif /* HAVE_STRCSPN */
461 
462 #ifndef HAVE_STRERROR
463 char *strerror(int errno);
464 #endif
465 
466 #ifndef HAVE_ATEXIT
467 int atexit(void (*function)(void));
468 
469 #ifndef HAVE_ON_EXIT
470 void myexit(int code) NORETURN;
471 #define exit myexit
472 #endif
473 
474 #endif
475 
476 
477 #ifndef HAVE_MEMMOVE
478 # define memmove(DST, SRC, N) bcopy(SRC, DST, N)
479 #endif
480 
481 #ifndef HAVE_STRCASECMP
482 int strcasecmp(const char *s1, const char *s2);
483 #endif
484 
485 #ifndef HAVE_STRNCASECMP
486 int strncasecmp(const char *s1, const char *s2, size_t n);
487 #endif
488 
489 #ifndef HAVE_GETPASS
490 char *getpass(const char *prompt);
491 #endif
492 
493 #ifdef HAVE_WCHAR_H
494 
495 # ifndef HAVE_WCSDUP
496 wchar_t *wcsdup(const wchar_t *wcs);
497 # endif
498 
499 # ifndef HAVE_WCSCASECMP
500 int wcscasecmp(const wchar_t *s1, const wchar_t *s2);
501 # endif
502 
503 # ifndef HAVE_WCSNLEN
504 size_t wcsnlen(const wchar_t *wcs, size_t l);
505 # endif
506 
507 #endif
508 
509 #if 0
510 #ifndef HAVE_BASENAME
511 const char *basename(const char *filename);
512 #endif
513 #endif
514 
515 const char *_basename(const char *filename);
516 
517 void _stripexe(char *filename);
518 
519 #ifndef __STDC__
520 # ifndef signed
521 #  define signed /**/
522 # endif
523 #endif /* !__STDC__ */
524 
525 
526 
527 /***************************************************************************/
528 /*                                                                         */
529 /* Prototypes for systems where the functions exist but not the prototypes */
530 /*                                                                         */
531 /***************************************************************************/
532 
533 
534 
535 /* prototypes which might be missing on some platforms, even if the functions
536  * are present.  Do not declare argument types, in order to avoid conflict
537  * on platforms where the prototypes _are_ correct.  Indeed, for most of
538  * these, there are _several_ "correct" parameter definitions, and not all
539  * platforms use the same.  For instance, some use the const attribute for
540  * strings not modified by the function, and others do not.  By using just
541  * the return type, which rarely changes, we avoid these problems.
542  */
543 
544 /* Correction:  Now it seems that even return values are not standardized :-(
545   For instance  DEC-ALPHA, OSF/1 3.2d uses ssize_t as a return type for read
546   and write.  NextStep uses a non-void return value for exit, etc.  With the
547   advent of 64 bit system, we'll expect more of these problems in the future.
548   Better uncomment the lot, except on SunOS, which is known to have bad
549   incomplete files.  Add other OS'es with incomplete include files as needed
550   */
551 #if (defined OS_sunos || defined OS_ultrix)
552 int read();
553 int write();
554 int fflush();
555 char *strdup();
556 int strcasecmp();
557 int strncasecmp();
558 char *getenv();
559 unsigned long strtoul();
560 int pclose();
561 void exit();
562 char *getpass();
563 int atoi();
564 FILE *fdopen();
565 FILE *popen();
566 #endif
567 
568 #ifndef MAXPATHLEN
569 # ifdef PATH_MAX
570 #  define MAXPATHLEN PATH_MAX
571 # else
572 #  define MAXPATHLEN 1024
573 # endif
574 #endif
575 
576 
577 #ifndef OS_linux
578 # undef USE_XDF
579 #endif
580 
581 #ifdef NO_XDF
582 # undef USE_XDF
583 #endif
584 
585 #ifdef __EMX__
586 #define INCL_BASE
587 #define INCL_DOSDEVIOCTL
588 #include <os2.h>
589 #endif
590 
591 #ifdef OS_nextstep
592 /* nextstep doesn't have this.  Unfortunately, we cannot test its presence
593    using AC_EGREP_HEADER, as we don't know _which_ header to test, and in
594    the general case utime.h might be non-existent */
595 struct utimbuf
596 {
597   time_t actime,modtime;
598 };
599 #endif
600 
601 /* NeXTStep doesn't have these */
602 #if !defined(S_ISREG) && defined (_S_IFMT) && defined (_S_IFREG)
603 #define S_ISREG(mode)   (((mode) & (_S_IFMT)) == (_S_IFREG))
604 #endif
605 
606 #if !defined(S_ISDIR) && defined (_S_IFMT) && defined (_S_IFDIR)
607 #define S_ISDIR(mode)   (((mode) & (_S_IFMT)) == (_S_IFDIR))
608 #endif
609 
610 
611 #ifdef OS_aix
612 /* AIX has an offset_t time, but somehow it is not scalar ==> forget about it
613  */
614 # undef HAVE_OFFSET_T
615 #endif
616 
617 
618 #ifdef HAVE_STAT64
619 #define MT_STAT stat64
620 #define MT_LSTAT lstat64
621 #define MT_FSTAT fstat64
622 #else
623 #define MT_STAT stat
624 #define MT_LSTAT lstat
625 #define MT_FSTAT fstat
626 #endif
627 
628 
629 #ifndef O_LARGEFILE
630 #define O_LARGEFILE 0
631 #endif
632 
633 #ifndef __GNUC__
634 #ifndef __inline__
635 #define __inline__ inline
636 #endif
637 #endif
638 
639 #endif
640