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