2424// Must go after undef _FILE_OFFSET_BITS.
2525#include " sanitizer_platform.h"
2626
27- #if SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU
27+ #if SANITIZER_LINUX || SANITIZER_APPLE || SANITIZER_HAIKU || SANITIZER_AIX
2828// Must go after undef _FILE_OFFSET_BITS.
2929#include " sanitizer_glibc_version.h"
3030
6161#endif
6262
6363#if !SANITIZER_ANDROID
64- #if !SANITIZER_HAIKU
64+ #if !SANITIZER_HAIKU && !SANITIZER_AIX
6565#include < sys/mount.h>
6666#endif
6767#include < sys/timeb.h>
@@ -112,11 +112,15 @@ typedef struct user_fpregs elf_fpregset_t;
112112#endif
113113
114114#if !SANITIZER_ANDROID
115- #include < ifaddrs.h>
116- #if !SANITIZER_HAIKU
117- #include < sys/ucontext.h>
118- #include < wordexp.h>
119- #endif
115+ # if !SANITIZER_AIX
116+ # include < ifaddrs.h>
117+ # else
118+ # include < netinet/in.h>
119+ # endif
120+ # if !SANITIZER_HAIKU
121+ # include < sys/ucontext.h>
122+ # include < wordexp.h>
123+ # endif
120124#endif
121125
122126#if SANITIZER_LINUX
@@ -182,6 +186,17 @@ typedef struct user_fpregs elf_fpregset_t;
182186#include < sys/ioctl.h>
183187#endif
184188
189+ # if SANITIZER_AIX
190+ # include < netinet/ip_mroute.h>
191+ # include < stropts.h>
192+ # include < sys/ioctl.h>
193+ # include < sys/statfs.h>
194+ # include < unistd.h>
195+ # if HAVE_RPC_XDR_H
196+ # include < tirpc/rpc/xdr.h>
197+ # endif
198+ # endif
199+
185200// Include these after system headers to avoid name clashes and ambiguities.
186201# include " sanitizer_common.h"
187202# include " sanitizer_internal_defs.h"
@@ -557,13 +572,20 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
557572
558573 const unsigned IOCTL_NOT_PRESENT = 0 ;
559574
560- unsigned IOCTL_FIONBIO = FIONBIO;
575+ // On AIX, some variables are unsigned long types.
576+ #if SANITIZER_AIX
577+ using ioctl_alttype = uptr;
578+ #else
579+ using ioctl_alttype = unsigned ;
580+ #endif
581+
582+ ioctl_alttype IOCTL_FIONBIO = FIONBIO;
561583#if !SANITIZER_HAIKU
562- unsigned IOCTL_FIOASYNC = FIOASYNC;
584+ ioctl_alttype IOCTL_FIOASYNC = FIOASYNC;
563585 unsigned IOCTL_FIOCLEX = FIOCLEX;
564586 unsigned IOCTL_FIOGETOWN = FIOGETOWN;
565587 unsigned IOCTL_FIONCLEX = FIONCLEX;
566- unsigned IOCTL_FIOSETOWN = FIOSETOWN;
588+ ioctl_alttype IOCTL_FIOSETOWN = FIOSETOWN;
567589#endif
568590 unsigned IOCTL_SIOCADDMULTI = SIOCADDMULTI;
569591 unsigned IOCTL_SIOCATMARK = SIOCATMARK;
@@ -584,29 +606,31 @@ unsigned struct_ElfW_Phdr_sz = sizeof(Elf_Phdr);
584606 unsigned IOCTL_SIOCSIFMETRIC = SIOCSIFMETRIC;
585607 unsigned IOCTL_SIOCSIFMTU = SIOCSIFMTU;
586608 unsigned IOCTL_SIOCSIFNETMASK = SIOCSIFNETMASK;
587- unsigned IOCTL_SIOCSPGRP = SIOCSPGRP;
609+ ioctl_alttype IOCTL_SIOCSPGRP = SIOCSPGRP;
588610
589611#if !SANITIZER_HAIKU
590- unsigned IOCTL_TIOCCONS = TIOCCONS;
612+ ioctl_alttype IOCTL_TIOCCONS = TIOCCONS;
591613 unsigned IOCTL_TIOCGETD = TIOCGETD;
592614 unsigned IOCTL_TIOCNOTTY = TIOCNOTTY;
593- unsigned IOCTL_TIOCPKT = TIOCPKT;
594- unsigned IOCTL_TIOCSETD = TIOCSETD;
595- unsigned IOCTL_TIOCSTI = TIOCSTI;
615+ ioctl_alttype IOCTL_TIOCPKT = TIOCPKT;
616+ ioctl_alttype IOCTL_TIOCSETD = TIOCSETD;
617+ ioctl_alttype IOCTL_TIOCSTI = TIOCSTI;
596618#endif
597619
598620 unsigned IOCTL_TIOCEXCL = TIOCEXCL;
599621 unsigned IOCTL_TIOCGPGRP = TIOCGPGRP;
600622 unsigned IOCTL_TIOCGWINSZ = TIOCGWINSZ;
601- unsigned IOCTL_TIOCMBIC = TIOCMBIC;
602- unsigned IOCTL_TIOCMBIS = TIOCMBIS;
623+ ioctl_alttype IOCTL_TIOCMBIC = TIOCMBIC;
624+ ioctl_alttype IOCTL_TIOCMBIS = TIOCMBIS;
603625 unsigned IOCTL_TIOCMGET = TIOCMGET;
604- unsigned IOCTL_TIOCMSET = TIOCMSET;
626+ ioctl_alttype IOCTL_TIOCMSET = TIOCMSET;
605627 unsigned IOCTL_TIOCNXCL = TIOCNXCL;
606628 unsigned IOCTL_TIOCOUTQ = TIOCOUTQ;
629+ # if !SANITIZER_AIX
607630 unsigned IOCTL_TIOCSCTTY = TIOCSCTTY;
608- unsigned IOCTL_TIOCSPGRP = TIOCSPGRP;
609- unsigned IOCTL_TIOCSWINSZ = TIOCSWINSZ;
631+ # endif
632+ ioctl_alttype IOCTL_TIOCSPGRP = TIOCSPGRP;
633+ ioctl_alttype IOCTL_TIOCSWINSZ = TIOCSWINSZ;
610634#if SANITIZER_LINUX && !SANITIZER_ANDROID
611635 unsigned IOCTL_SIOCGETSGCNT = SIOCGETSGCNT;
612636 unsigned IOCTL_SIOCGETVIFCNT = SIOCGETVIFCNT;
@@ -1115,6 +1139,8 @@ COMPILER_CHECK(sizeof(__sanitizer_dirent) <= sizeof(dirent));
11151139CHECK_SIZE_AND_OFFSET (dirent, d_ino);
11161140#if SANITIZER_APPLE
11171141CHECK_SIZE_AND_OFFSET (dirent, d_seekoff);
1142+ #elif SANITIZER_AIX
1143+ CHECK_SIZE_AND_OFFSET (dirent, d_offset);
11181144#elif SANITIZER_FREEBSD || SANITIZER_HAIKU
11191145// There is no 'd_off' field on FreeBSD.
11201146#else
@@ -1205,8 +1231,10 @@ CHECK_SIZE_AND_OFFSET(tm, tm_year);
12051231CHECK_SIZE_AND_OFFSET (tm, tm_wday);
12061232CHECK_SIZE_AND_OFFSET (tm, tm_yday);
12071233CHECK_SIZE_AND_OFFSET (tm, tm_isdst);
1234+ # if !SANITIZER_AIX
12081235CHECK_SIZE_AND_OFFSET (tm, tm_gmtoff);
12091236CHECK_SIZE_AND_OFFSET (tm, tm_zone);
1237+ # endif
12101238
12111239#if SANITIZER_LINUX
12121240CHECK_TYPE_SIZE (mntent);
@@ -1258,7 +1286,7 @@ CHECK_TYPE_SIZE(clock_t);
12581286CHECK_TYPE_SIZE (clockid_t );
12591287#endif
12601288
1261- #if !SANITIZER_ANDROID && !SANITIZER_HAIKU
1289+ #if !SANITIZER_ANDROID && !SANITIZER_HAIKU && !SANITIZER_AIX
12621290CHECK_TYPE_SIZE (ifaddrs);
12631291CHECK_SIZE_AND_OFFSET (ifaddrs, ifa_next);
12641292CHECK_SIZE_AND_OFFSET (ifaddrs, ifa_name);
0 commit comments