busybox/include/platform.h
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * Copyright 2006, Bernhard Reutner-Fischer
   4 *
   5 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
   6 */
   7#ifndef BB_PLATFORM_H
   8#define BB_PLATFORM_H 1
   9
  10
  11/* Convenience macros to test the version of gcc. */
  12#undef __GNUC_PREREQ
  13#if defined __GNUC__ && defined __GNUC_MINOR__
  14# define __GNUC_PREREQ(maj, min) \
  15                ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
  16#else
  17# define __GNUC_PREREQ(maj, min) 0
  18#endif
  19
  20/* __restrict is known in EGCS 1.2 and above. */
  21#if !__GNUC_PREREQ(2,92)
  22# ifndef __restrict
  23#  define __restrict
  24# endif
  25#endif
  26
  27#if !__GNUC_PREREQ(2,7)
  28# ifndef __attribute__
  29#  define __attribute__(x)
  30# endif
  31#endif
  32
  33#if !__GNUC_PREREQ(5,0)
  34# define deprecated(msg) deprecated
  35#endif
  36
  37#undef inline
  38#if defined(__STDC_VERSION__) && __STDC_VERSION__ > 199901L
  39/* it's a keyword */
  40#elif __GNUC_PREREQ(2,7)
  41# define inline __inline__
  42#else
  43# define inline
  44#endif
  45
  46#ifndef __const
  47# define __const const
  48#endif
  49
  50#define UNUSED_PARAM __attribute__ ((__unused__))
  51#define NORETURN __attribute__ ((__noreturn__))
  52
  53#if __GNUC_PREREQ(4,5)
  54# define bb_unreachable(altcode) __builtin_unreachable()
  55#else
  56# define bb_unreachable(altcode) altcode
  57#endif
  58
  59/* "The malloc attribute is used to tell the compiler that a function
  60 * may be treated as if any non-NULL pointer it returns cannot alias
  61 * any other pointer valid when the function returns. This will often
  62 * improve optimization. Standard functions with this property include
  63 * malloc and calloc. realloc-like functions have this property as long
  64 * as the old pointer is never referred to (including comparing it
  65 * to the new pointer) after the function returns a non-NULL value."
  66 */
  67#define RETURNS_MALLOC __attribute__ ((malloc))
  68#define PACKED __attribute__ ((__packed__))
  69#define ALIGNED(m) __attribute__ ((__aligned__(m)))
  70
  71/* __NO_INLINE__: some gcc's do not honor inlining! :( */
  72#if __GNUC_PREREQ(3,0) && !defined(__NO_INLINE__)
  73# define ALWAYS_INLINE __attribute__ ((always_inline)) inline
  74/* I've seen a toolchain where I needed __noinline__ instead of noinline */
  75# define NOINLINE      __attribute__((__noinline__))
  76# if !ENABLE_WERROR
  77#  define DEPRECATED __attribute__ ((__deprecated__))
  78#  define UNUSED_PARAM_RESULT __attribute__ ((warn_unused_result))
  79# else
  80#  define DEPRECATED
  81#  define UNUSED_PARAM_RESULT
  82# endif
  83#else
  84# define ALWAYS_INLINE inline
  85# define NOINLINE
  86# define DEPRECATED
  87# define UNUSED_PARAM_RESULT
  88#endif
  89
  90/* used by unit test machinery to run registration functions before calling main() */
  91#define INIT_FUNC __attribute__ ((constructor))
  92
  93/* -fwhole-program makes all symbols local. The attribute externally_visible
  94 * forces a symbol global.  */
  95#if __GNUC_PREREQ(4,1)
  96# define EXTERNALLY_VISIBLE __attribute__(( visibility("default") ))
  97//__attribute__ ((__externally_visible__))
  98#else
  99# define EXTERNALLY_VISIBLE
 100#endif
 101
 102/* At 4.4 gcc become much more anal about this, need to use "aliased" types */
 103#if __GNUC_PREREQ(4,4)
 104# define FIX_ALIASING __attribute__((__may_alias__))
 105#else
 106# define FIX_ALIASING
 107#endif
 108
 109/* We use __extension__ in some places to suppress -pedantic warnings
 110 * about GCC extensions.  This feature didn't work properly before
 111 * gcc 2.8.  */
 112#if !__GNUC_PREREQ(2,8)
 113# ifndef __extension__
 114#  define __extension__
 115# endif
 116#endif
 117
 118/* FAST_FUNC is a qualifier which (possibly) makes function call faster
 119 * and/or smaller by using modified ABI. It is usually only needed
 120 * on non-static, busybox internal functions. Recent versions of gcc
 121 * optimize statics automatically. FAST_FUNC on static is required
 122 * only if you need to match a function pointer's type.
 123 * FAST_FUNC may not work well with -flto so allow user to disable this.
 124 * (-DFAST_FUNC= )
 125 */
 126#ifndef FAST_FUNC
 127# if __GNUC_PREREQ(3,0) && defined(i386)
 128/* stdcall makes callee to pop arguments from stack, not caller */
 129#  define FAST_FUNC __attribute__((regparm(3),stdcall))
 130/* #elif ... - add your favorite arch today! */
 131# else
 132#  define FAST_FUNC
 133# endif
 134#endif
 135
 136/* Make all declarations hidden (-fvisibility flag only affects definitions) */
 137/* (don't include system headers after this until corresponding pop!) */
 138#if __GNUC_PREREQ(4,1) && !defined(__CYGWIN__)
 139# define PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN _Pragma("GCC visibility push(hidden)")
 140# define POP_SAVED_FUNCTION_VISIBILITY              _Pragma("GCC visibility pop")
 141#else
 142# define PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
 143# define POP_SAVED_FUNCTION_VISIBILITY
 144#endif
 145
 146/* gcc-2.95 had no va_copy but only __va_copy. */
 147#if !__GNUC_PREREQ(3,0)
 148# include <stdarg.h>
 149# if !defined va_copy && defined __va_copy
 150#  define va_copy(d,s) __va_copy((d),(s))
 151# endif
 152#endif
 153
 154
 155/* ---- Endian Detection ------------------------------------ */
 156
 157#include <limits.h>
 158#if defined(__digital__) && defined(__unix__)
 159# include <sex.h>
 160#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) \
 161   || defined(__APPLE__)
 162# include <sys/resource.h>  /* rlimit */
 163# include <machine/endian.h>
 164# define bswap_64 __bswap64
 165# define bswap_32 __bswap32
 166# define bswap_16 __bswap16
 167#else
 168# include <byteswap.h>
 169# include <endian.h>
 170#endif
 171
 172#if defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN
 173# define BB_BIG_ENDIAN 1
 174# define BB_LITTLE_ENDIAN 0
 175#elif defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN
 176# define BB_BIG_ENDIAN 0
 177# define BB_LITTLE_ENDIAN 1
 178#elif defined(_BYTE_ORDER) && _BYTE_ORDER == _BIG_ENDIAN
 179# define BB_BIG_ENDIAN 1
 180# define BB_LITTLE_ENDIAN 0
 181#elif defined(_BYTE_ORDER) && _BYTE_ORDER == _LITTLE_ENDIAN
 182# define BB_BIG_ENDIAN 0
 183# define BB_LITTLE_ENDIAN 1
 184#elif defined(BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN
 185# define BB_BIG_ENDIAN 1
 186# define BB_LITTLE_ENDIAN 0
 187#elif defined(BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN
 188# define BB_BIG_ENDIAN 0
 189# define BB_LITTLE_ENDIAN 1
 190#elif defined(__386__)
 191# define BB_BIG_ENDIAN 0
 192# define BB_LITTLE_ENDIAN 1
 193#else
 194# error "Can't determine endianness"
 195#endif
 196
 197#if ULONG_MAX > 0xffffffff
 198/* inline 64-bit bswap only on 64-bit arches */
 199# define bb_bswap_64(x) bswap_64(x)
 200#endif
 201
 202/* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */
 203#if BB_BIG_ENDIAN
 204# define SWAP_BE16(x) (x)
 205# define SWAP_BE32(x) (x)
 206# define SWAP_BE64(x) (x)
 207# define SWAP_LE16(x) bswap_16(x)
 208# define SWAP_LE32(x) bswap_32(x)
 209# define SWAP_LE64(x) bb_bswap_64(x)
 210# define IF_BIG_ENDIAN(...) __VA_ARGS__
 211# define IF_LITTLE_ENDIAN(...)
 212#else
 213# define SWAP_BE16(x) bswap_16(x)
 214# define SWAP_BE32(x) bswap_32(x)
 215# define SWAP_BE64(x) bb_bswap_64(x)
 216# define SWAP_LE16(x) (x)
 217# define SWAP_LE32(x) (x)
 218# define SWAP_LE64(x) (x)
 219# define IF_BIG_ENDIAN(...)
 220# define IF_LITTLE_ENDIAN(...) __VA_ARGS__
 221#endif
 222
 223
 224/* ---- Unaligned access ------------------------------------ */
 225
 226#include <stdint.h>
 227typedef int      bb__aliased_int      FIX_ALIASING;
 228typedef long     bb__aliased_long     FIX_ALIASING;
 229typedef uint16_t bb__aliased_uint16_t FIX_ALIASING;
 230typedef uint32_t bb__aliased_uint32_t FIX_ALIASING;
 231typedef uint64_t bb__aliased_uint64_t FIX_ALIASING;
 232
 233/* NB: unaligned parameter should be a pointer, aligned one -
 234 * a lvalue. This makes it more likely to not swap them by mistake
 235 */
 236#if defined(i386) || defined(__x86_64__) || defined(__powerpc__)
 237# define BB_UNALIGNED_MEMACCESS_OK 1
 238# define move_from_unaligned_int(v, intp)  ((v) = *(bb__aliased_int*)(intp))
 239# define move_from_unaligned_long(v, longp) ((v) = *(bb__aliased_long*)(longp))
 240# define move_from_unaligned16(v, u16p) ((v) = *(bb__aliased_uint16_t*)(u16p))
 241# define move_from_unaligned32(v, u32p) ((v) = *(bb__aliased_uint32_t*)(u32p))
 242# define move_to_unaligned16(u16p, v)   (*(bb__aliased_uint16_t*)(u16p) = (v))
 243# define move_to_unaligned32(u32p, v)   (*(bb__aliased_uint32_t*)(u32p) = (v))
 244# define move_to_unaligned64(u64p, v)   (*(bb__aliased_uint64_t*)(u64p) = (v))
 245/* #elif ... - add your favorite arch today! */
 246#else
 247# define BB_UNALIGNED_MEMACCESS_OK 0
 248/* performs reasonably well (gcc usually inlines memcpy here) */
 249# define move_from_unaligned_int(v, intp) (memcpy(&(v), (intp), sizeof(int)))
 250# define move_from_unaligned_long(v, longp) (memcpy(&(v), (longp), sizeof(long)))
 251# define move_from_unaligned16(v, u16p) (memcpy(&(v), (u16p), 2))
 252# define move_from_unaligned32(v, u32p) (memcpy(&(v), (u32p), 4))
 253# define move_to_unaligned16(u16p, v) do { \
 254        uint16_t __t = (v); \
 255        memcpy((u16p), &__t, 2); \
 256} while (0)
 257# define move_to_unaligned32(u32p, v) do { \
 258        uint32_t __t = (v); \
 259        memcpy((u32p), &__t, 4); \
 260} while (0)
 261# define move_to_unaligned64(u64p, v) do { \
 262        uint64_t __t = (v); \
 263        memcpy((u64p), &__t, 8); \
 264} while (0)
 265#endif
 266
 267/* Unaligned, fixed-endian accessors */
 268#define get_unaligned_le32(buf) ({ uint32_t v; move_from_unaligned32(v, buf); SWAP_LE32(v); })
 269#define get_unaligned_be32(buf) ({ uint32_t v; move_from_unaligned32(v, buf); SWAP_BE32(v); })
 270#define put_unaligned_le32(val, buf) move_to_unaligned32(buf, SWAP_LE32(val))
 271#define put_unaligned_be32(val, buf) move_to_unaligned32(buf, SWAP_BE32(val))
 272
 273/* unxz needs an aligned fixed-endian accessor.
 274 * (however, the compiler does not realize it's aligned, the cast is still necessary)
 275 */
 276#define get_le32(u32p) ({ uint32_t v = *(bb__aliased_uint32_t*)(u32p); SWAP_LE32(v); })
 277
 278
 279/* ---- Size-saving "small" ints (arch-dependent) ----------- */
 280
 281#if defined(i386) || defined(__x86_64__) || defined(__mips__) || defined(__cris__)
 282/* add other arches which benefit from this... */
 283typedef signed char smallint;
 284typedef unsigned char smalluint;
 285#else
 286/* for arches where byte accesses generate larger code: */
 287typedef int smallint;
 288typedef unsigned smalluint;
 289#endif
 290
 291/* ISO C Standard:  7.16  Boolean type and values  <stdbool.h> */
 292#if (defined __digital__ && defined __unix__)
 293/* old system without (proper) C99 support */
 294# define bool smalluint
 295#else
 296/* modern system, so use it */
 297# include <stdbool.h>
 298#endif
 299
 300
 301/*----- Kernel versioning ------------------------------------*/
 302
 303#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
 304
 305#ifdef __UCLIBC__
 306# define UCLIBC_VERSION KERNEL_VERSION(__UCLIBC_MAJOR__, __UCLIBC_MINOR__, __UCLIBC_SUBLEVEL__)
 307#else
 308# define UCLIBC_VERSION 0
 309#endif
 310
 311
 312/* ---- Miscellaneous --------------------------------------- */
 313
 314#if defined __GLIBC__ \
 315 || defined __UCLIBC__ \
 316 || defined __dietlibc__ \
 317 || defined __BIONIC__ \
 318 || defined _NEWLIB_VERSION
 319# include <features.h>
 320#endif
 321
 322/* Define bb_setpgrp */
 323#if (defined(__digital__) && defined(__unix__)) || defined(__FreeBSD__)
 324/* use legacy setpgrp(pid_t, pid_t) for now.  move to platform.c */
 325# define bb_setpgrp() do { pid_t __me = getpid(); setpgrp(__me, __me); } while (0)
 326#else
 327# define bb_setpgrp() setpgrp()
 328#endif
 329
 330/* fdprintf is more readable, we used it before dprintf was standardized */
 331#include <unistd.h>
 332#define fdprintf dprintf
 333
 334/* Useful for defeating gcc's alignment of "char message[]"-like data */
 335#if !defined(__s390__)
 336    /* on s390[x], non-word-aligned data accesses require larger code */
 337# define ALIGN1 __attribute__((aligned(1)))
 338# define ALIGN2 __attribute__((aligned(2)))
 339# define ALIGN4 __attribute__((aligned(4)))
 340#else
 341/* Arches which MUST have 2 or 4 byte alignment for everything are here */
 342# define ALIGN1
 343# define ALIGN2
 344# define ALIGN4
 345#endif
 346#define ALIGN8     __attribute__((aligned(8)))
 347#define ALIGN_PTR  __attribute__((aligned(sizeof(void*))))
 348
 349/*
 350 * For 0.9.29 and svn, __ARCH_USE_MMU__ indicates no-mmu reliably.
 351 * For earlier versions there is no reliable way to check if we are building
 352 * for a mmu-less system.
 353 */
 354#if ENABLE_NOMMU || \
 355    (defined __UCLIBC__ && \
 356     UCLIBC_VERSION > KERNEL_VERSION(0, 9, 28) && \
 357     !defined __ARCH_USE_MMU__)
 358# define BB_MMU 0
 359# define USE_FOR_NOMMU(...) __VA_ARGS__
 360# define USE_FOR_MMU(...)
 361#else
 362# define BB_MMU 1
 363# define USE_FOR_NOMMU(...)
 364# define USE_FOR_MMU(...) __VA_ARGS__
 365#endif
 366
 367#if defined(__digital__) && defined(__unix__)
 368# include <standards.h>
 369# include <inttypes.h>
 370# define PRIu32 "u"
 371# if !defined ADJ_OFFSET_SINGLESHOT && defined MOD_CLKA && defined MOD_OFFSET
 372#  define ADJ_OFFSET_SINGLESHOT (MOD_CLKA | MOD_OFFSET)
 373# endif
 374# if !defined ADJ_FREQUENCY && defined MOD_FREQUENCY
 375#  define ADJ_FREQUENCY MOD_FREQUENCY
 376# endif
 377# if !defined ADJ_TIMECONST && defined MOD_TIMECONST
 378#  define ADJ_TIMECONST MOD_TIMECONST
 379# endif
 380# if !defined ADJ_TICK && defined MOD_CLKB
 381#  define ADJ_TICK MOD_CLKB
 382# endif
 383#endif
 384
 385#if defined(__CYGWIN__)
 386# define MAXSYMLINKS SYMLOOP_MAX
 387#endif
 388
 389#if defined(ANDROID) || defined(__ANDROID__)
 390# define BB_ADDITIONAL_PATH ":/system/sbin:/system/bin:/system/xbin"
 391# define SYS_ioprio_set __NR_ioprio_set
 392# define SYS_ioprio_get __NR_ioprio_get
 393#endif
 394
 395
 396/* ---- Who misses what? ------------------------------------ */
 397
 398/* Assume all these functions and header files exist by default.
 399 * Platforms where it is not true will #undef them below.
 400 */
 401#define HAVE_CLEARENV 1
 402#define HAVE_FDATASYNC 1
 403#define HAVE_DPRINTF 1
 404#define HAVE_MEMRCHR 1
 405#define HAVE_MKDTEMP 1
 406#define HAVE_TTYNAME_R 1
 407#define HAVE_PTSNAME_R 1
 408#define HAVE_SETBIT 1
 409#define HAVE_SIGHANDLER_T 1
 410#define HAVE_STPCPY 1
 411#define HAVE_STPNCPY 1
 412#define HAVE_MEMPCPY 1
 413#define HAVE_STRCASESTR 1
 414#define HAVE_STRCHRNUL 1
 415#define HAVE_STRSEP 1
 416#define HAVE_STRSIGNAL 1
 417#define HAVE_STRVERSCMP 1
 418#define HAVE_VASPRINTF 1
 419#define HAVE_USLEEP 1
 420#define HAVE_UNLOCKED_STDIO 1
 421#define HAVE_UNLOCKED_LINE_OPS 1
 422#define HAVE_GETLINE 1
 423#define HAVE_XTABS 1
 424#define HAVE_MNTENT_H 1
 425#define HAVE_NET_ETHERNET_H 1
 426#define HAVE_SYS_STATFS_H 1
 427#define HAVE_PRINTF_PERCENTM 1
 428#define HAVE_WAIT3 1
 429#define HAVE_DEV_FD 1
 430#define DEV_FD_PREFIX "/dev/fd/"
 431
 432#if defined(__UCLIBC__)
 433# if UCLIBC_VERSION < KERNEL_VERSION(0, 9, 32)
 434#  undef HAVE_STRVERSCMP
 435# endif
 436# if UCLIBC_VERSION >= KERNEL_VERSION(0, 9, 30)
 437#  ifndef __UCLIBC_SUSV3_LEGACY__
 438#   undef HAVE_USLEEP
 439#  endif
 440# endif
 441#endif
 442
 443#if defined(__WATCOMC__)
 444# undef HAVE_DPRINTF
 445# undef HAVE_GETLINE
 446# undef HAVE_MEMRCHR
 447# undef HAVE_MKDTEMP
 448# undef HAVE_SETBIT
 449# undef HAVE_STPCPY
 450# undef HAVE_STPNCPY
 451# undef HAVE_STRCASESTR
 452# undef HAVE_STRCHRNUL
 453# undef HAVE_STRSEP
 454# undef HAVE_STRSIGNAL
 455# undef HAVE_STRVERSCMP
 456# undef HAVE_VASPRINTF
 457# undef HAVE_UNLOCKED_STDIO
 458# undef HAVE_UNLOCKED_LINE_OPS
 459# undef HAVE_NET_ETHERNET_H
 460#endif
 461
 462#if defined(__CYGWIN__)
 463# undef HAVE_CLEARENV
 464# undef HAVE_FDPRINTF
 465# undef HAVE_MEMRCHR
 466# undef HAVE_PTSNAME_R
 467# undef HAVE_STRVERSCMP
 468# undef HAVE_UNLOCKED_LINE_OPS
 469#endif
 470
 471/* These BSD-derived OSes share many similarities */
 472#if (defined __digital__ && defined __unix__) \
 473 || defined __APPLE__ \
 474 || defined __OpenBSD__ || defined __NetBSD__
 475# undef HAVE_CLEARENV
 476# undef HAVE_FDATASYNC
 477# undef HAVE_GETLINE
 478# undef HAVE_MNTENT_H
 479# undef HAVE_PTSNAME_R
 480# undef HAVE_SYS_STATFS_H
 481# undef HAVE_SIGHANDLER_T
 482# undef HAVE_STRVERSCMP
 483# undef HAVE_XTABS
 484# undef HAVE_DPRINTF
 485# undef HAVE_UNLOCKED_STDIO
 486# undef HAVE_UNLOCKED_LINE_OPS
 487# undef HAVE_PRINTF_PERCENTM
 488#endif
 489
 490#if defined(__dietlibc__)
 491# undef HAVE_STRCHRNUL
 492#endif
 493
 494#if defined(__APPLE__)
 495# undef HAVE_STRCHRNUL
 496#endif
 497
 498#if defined(__FreeBSD__)
 499/* users say mempcpy is not present in FreeBSD 9.x */
 500# undef HAVE_MEMPCPY
 501# undef HAVE_CLEARENV
 502# undef HAVE_FDATASYNC
 503# undef HAVE_MNTENT_H
 504# undef HAVE_PTSNAME_R
 505# undef HAVE_SYS_STATFS_H
 506# undef HAVE_SIGHANDLER_T
 507# undef HAVE_STRVERSCMP
 508# undef HAVE_XTABS
 509# undef HAVE_UNLOCKED_LINE_OPS
 510# undef HAVE_PRINTF_PERCENTM
 511# include <osreldate.h>
 512# if __FreeBSD_version < 1000029
 513#  undef HAVE_STRCHRNUL /* FreeBSD added strchrnul() between 1000028 and 1000029 */
 514# endif
 515#endif
 516
 517#if defined(__NetBSD__)
 518# define HAVE_GETLINE 1  /* Recent NetBSD versions have getline() */
 519#endif
 520
 521#if defined(__digital__) && defined(__unix__)
 522# undef HAVE_STPCPY
 523# undef HAVE_STPNCPY
 524#endif
 525
 526#if defined(ANDROID) || defined(__ANDROID__)
 527# if __ANDROID_API__ < 8
 528   /* ANDROID < 8 has no [f]dprintf at all */
 529#  undef HAVE_DPRINTF
 530# elif __ANDROID_API__ < 21
 531   /* ANDROID < 21 has fdprintf */
 532#  define dprintf fdprintf
 533# else
 534   /* ANDROID >= 21 has standard dprintf */
 535# endif
 536# if __ANDROID_API__ < 21
 537#  undef HAVE_TTYNAME_R
 538#  undef HAVE_GETLINE
 539#  undef HAVE_STPCPY
 540#  undef HAVE_STPNCPY
 541# endif
 542# if __ANDROID_API__ >= 21
 543#  undef HAVE_WAIT3
 544# endif
 545# undef HAVE_MEMPCPY
 546# undef HAVE_STRCHRNUL
 547# undef HAVE_STRVERSCMP
 548# undef HAVE_UNLOCKED_LINE_OPS
 549# undef HAVE_NET_ETHERNET_H
 550# undef HAVE_PRINTF_PERCENTM
 551#endif
 552
 553/*
 554 * Now, define prototypes for all the functions defined in platform.c
 555 * These must come after all the HAVE_* macros are defined (or not)
 556 */
 557
 558#ifndef HAVE_DPRINTF
 559extern int dprintf(int fd, const char *format, ...);
 560#endif
 561
 562#ifndef HAVE_MEMRCHR
 563extern void *memrchr(const void *s, int c, size_t n) FAST_FUNC;
 564#endif
 565
 566#ifndef HAVE_MKDTEMP
 567extern char *mkdtemp(char *template) FAST_FUNC;
 568#endif
 569
 570#ifndef HAVE_TTYNAME_R
 571#define ttyname_r bb_ttyname_r
 572extern int ttyname_r(int fd, char *buf, size_t buflen);
 573#endif
 574
 575#ifndef HAVE_SETBIT
 576# define setbit(a, b)  ((a)[(b) >> 3] |= 1 << ((b) & 7))
 577# define clrbit(a, b)  ((a)[(b) >> 3] &= ~(1 << ((b) & 7)))
 578#endif
 579
 580#ifndef HAVE_SIGHANDLER_T
 581typedef void (*sighandler_t)(int);
 582#endif
 583
 584#ifndef HAVE_STPCPY
 585extern char *stpcpy(char *p, const char *to_add) FAST_FUNC;
 586#endif
 587
 588#ifndef HAVE_STPNCPY
 589extern char *stpncpy(char *p, const char *to_add, size_t n) FAST_FUNC;
 590#endif
 591
 592#ifndef HAVE_MEMPCPY
 593#include <string.h>
 594/* In case we are wrong about !HAVE_MEMPCPY, and toolchain _does_ have
 595 * mempcpy(), avoid colliding with it:
 596 */
 597#define mempcpy bb__mempcpy
 598static ALWAYS_INLINE void *mempcpy(void *dest, const void *src, size_t len)
 599{
 600        return memcpy(dest, src, len) + len;
 601}
 602#endif
 603
 604#ifndef HAVE_STRCASESTR
 605extern char *strcasestr(const char *s, const char *pattern) FAST_FUNC;
 606#endif
 607
 608#ifndef HAVE_STRCHRNUL
 609extern char *strchrnul(const char *s, int c) FAST_FUNC;
 610#endif
 611
 612#ifndef HAVE_STRSEP
 613extern char *strsep(char **stringp, const char *delim) FAST_FUNC;
 614#endif
 615
 616#ifndef HAVE_STRSIGNAL
 617/* Not exactly the same: instead of "Stopped" it shows "STOP" etc */
 618# define strsignal(sig) get_signame(sig)
 619#endif
 620
 621#ifndef HAVE_USLEEP
 622extern int usleep(unsigned) FAST_FUNC;
 623#endif
 624
 625#ifndef HAVE_VASPRINTF
 626extern int vasprintf(char **string_ptr, const char *format, va_list p) FAST_FUNC;
 627#endif
 628
 629#ifndef HAVE_GETLINE
 630# include <stdio.h> /* for FILE */
 631# include <sys/types.h> /* size_t */
 632extern ssize_t getline(char **lineptr, size_t *n, FILE *stream) FAST_FUNC;
 633#endif
 634
 635#endif
 636