vlc_fixups.h 13.5 KB
Newer Older
1
/*****************************************************************************
Pere Orga's avatar
Pere Orga committed
2
 * vlc_fixups.h: portability fixups included from config.h
3
 *****************************************************************************
4
 * Copyright © 1998-2008 the VideoLAN project
5
 *
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
6 7 8
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
9 10 11 12
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
13 14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Lesser General Public License for more details.
15
 *
Jean-Baptiste Kempf's avatar
LGPL  
Jean-Baptiste Kempf committed
16 17 18
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19 20 21 22 23 24 25
 *****************************************************************************/

/**
 * \file
 * This file is a collection of portability fixes
 */

26 27 28
#ifndef LIBVLC_FIXUPS_H
# define LIBVLC_FIXUPS_H 1

29 30 31 32 33
/* needed to detect uClibc */
#ifdef HAVE_FEATURES_H
#include <features.h>
#endif

34 35
/* C++11 says there's no need to define __STDC_*_MACROS when including
 * inttypes.h and stdint.h. */
36
#if defined (__cplusplus) && (defined(__MINGW32__) || defined(__UCLIBC__) || defined(__native_client__))
37 38 39 40 41 42 43 44 45
# ifndef __STDC_FORMAT_MACROS
#  define __STDC_FORMAT_MACROS 1
# endif
# ifndef __STDC_CONSTANT_MACROS
#  define __STDC_CONSTANT_MACROS 1
# endif
# ifndef __STDC_LIMIT_MACROS
#  define __STDC_LIMIT_MACROS 1
# endif
46 47
#endif

48 49 50 51 52 53 54 55 56 57 58 59
#ifndef __cplusplus
# ifdef HAVE_THREADS_H
#  include <threads.h>
# elif !defined(thread_local)
#  ifdef HAVE_THREAD_LOCAL
#   define thread_local _Thread_local
#  elif defined(_MSC_VER)
#   define thread_local __declspec(thread)
#  endif
# endif
#endif

60 61
#if !defined (HAVE_GMTIME_R) || !defined (HAVE_LOCALTIME_R) \
 || !defined (HAVE_TIMEGM)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
62 63 64
# include <time.h> /* time_t */
#endif

65 66 67 68 69 70 71 72
#ifndef HAVE_GETTIMEOFDAY
#ifdef _WIN32
#include <winsock2.h>
#else
#include <sys/time.h>
#endif
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
73 74 75 76 77 78 79 80
#ifndef HAVE_LLDIV
typedef struct
{
    long long quot; /* Quotient. */
    long long rem;  /* Remainder. */
} lldiv_t;
#endif

81 82
#if !defined(HAVE_GETENV) || \
    !defined(HAVE_USELOCALE)
Rafaël Carré's avatar
Rafaël Carré committed
83
# include <stddef.h> /* NULL */
84 85
#endif

86
#if !defined (HAVE_REWIND) || \
87
    !defined (HAVE_GETDELIM)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
88 89 90
# include <stdio.h> /* FILE */
#endif

91
#if !defined (HAVE_ALIGNED_ALLOC) || \
92
    !defined (HAVE_MEMRCHR) || \
93
    !defined (HAVE_STRLCPY) || \
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
94
    !defined (HAVE_STRNDUP) || \
95 96
    !defined (HAVE_STRNLEN) || \
    !defined (HAVE_STRNSTR)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
97 98 99 100 101 102 103
# include <stddef.h> /* size_t */
#endif

#ifndef HAVE_VASPRINTF
# include <stdarg.h> /* va_list */
#endif

104
#if !defined (HAVE_GETDELIM) || \
105 106 107
    !defined (HAVE_GETPID)   || \
    !defined (HAVE_SWAB)
# include <sys/types.h> /* ssize_t, pid_t */
108 109
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
110 111
#if !defined (HAVE_DIRFD) || \
    !defined (HAVE_FDOPENDIR)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
112 113 114
# include <dirent.h>
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
115
#ifdef __cplusplus
116
# define VLC_NOTHROW throw ()
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
117
extern "C" {
118 119
#else
# define VLC_NOTHROW
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
120 121
#endif

122 123 124 125 126 127 128 129 130
/* signal.h */
#if !defined(HAVE_SIGWAIT) && defined(__native_client__)
/* NaCl does not define sigwait in signal.h. We need to include it here to
 * define sigwait, because sigset_t is allowed to be either an integral or a
 * struct. */
#include <signal.h>
int sigwait(const sigset_t *set, int *sig);
#endif

131
/* stddef.h */
132
#if !defined (__cplusplus) && !defined (HAVE_MAX_ALIGN_T)
133 134 135 136 137 138
typedef struct {
  long long ll;
  long double ld;
} max_align_t;
#endif

139 140 141 142 143
/* stdio.h */
#ifndef HAVE_ASPRINTF
int asprintf (char **, const char *, ...);
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
144 145 146 147 148 149 150 151 152
#ifndef HAVE_FLOCKFILE
void flockfile (FILE *);
void funlockfile (FILE *);
int getc_unlocked (FILE *);
int getchar_unlocked (void);
int putc_unlocked (int, FILE *);
int putchar_unlocked (int);
#endif

153
#ifndef HAVE_GETDELIM
154 155 156 157 158 159
ssize_t getdelim (char **, size_t *, int, FILE *);
ssize_t getline (char **, size_t *, FILE *);
#endif

#ifndef HAVE_REWIND
void rewind (FILE *);
160 161 162
#endif

#ifndef HAVE_VASPRINTF
163
int vasprintf (char **, const char *, va_list);
164 165
#endif

166
/* string.h */
167 168 169 170
#ifndef HAVE_MEMRCHR
void *memrchr(const void *, int, size_t);
#endif

171 172 173 174 175 176 177 178 179 180 181 182
#ifndef HAVE_STRCASECMP
int strcasecmp (const char *, const char *);
#endif

#ifndef HAVE_STRCASESTR
char *strcasestr (const char *, const char *);
#endif

#ifndef HAVE_STRDUP
char *strdup (const char *);
#endif

183 184 185 186
#ifndef HAVE_STRVERSCMP
int strverscmp (const char *, const char *);
#endif

187
#ifndef HAVE_STRNLEN
188
size_t strnlen (const char *, size_t);
189 190
#endif

François Cartegnie's avatar
François Cartegnie committed
191 192 193 194
#ifndef HAVE_STRNSTR
char * strnstr (const char *, const char *, size_t);
#endif

195
#ifndef HAVE_STRNDUP
196
char *strndup (const char *, size_t);
197 198 199
#endif

#ifndef HAVE_STRLCPY
200
size_t strlcpy (char *, const char *, size_t);
201 202
#endif

203 204
#ifndef HAVE_STRSEP
char *strsep (char **, const char *);
205
#endif
206 207 208

#ifndef HAVE_STRTOK_R
char *strtok_r(char *, const char *, char **);
209
#endif
210

211
/* stdlib.h */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
212
#ifndef HAVE_ATOF
213
#ifndef __ANDROID__
214
double atof (const char *);
215
#endif
216
#endif
217

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
218
#ifndef HAVE_ATOLL
219
long long atoll (const char *);
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
220 221
#endif

222
#ifndef HAVE_LLDIV
223
lldiv_t lldiv (long long, long long);
224 225
#endif

226 227 228
#ifndef HAVE_STRTOF
#ifndef __ANDROID__
float strtof (const char *, char **);
229 230 231
#endif
#endif

232 233
#ifndef HAVE_STRTOLL
long long int strtoll (const char *, char **, int);
234 235
#endif

236
/* time.h */
237 238 239
#ifndef HAVE_GMTIME_R
struct tm *gmtime_r (const time_t *, struct tm *);
#endif
240

241 242 243
#ifndef HAVE_LOCALTIME_R
struct tm *localtime_r (const time_t *, struct tm *);
#endif
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
244

245
#ifndef HAVE_TIMEGM
246
time_t timegm(struct tm *);
247 248
#endif

249 250
#ifndef HAVE_TIMESPEC_GET
#define TIME_UTC 1
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
251
struct timespec;
252 253 254
int timespec_get(struct timespec *, int);
#endif

255 256
/* sys/time.h */
#ifndef HAVE_GETTIMEOFDAY
257
struct timezone;
258 259 260
int gettimeofday(struct timeval *, struct timezone *);
#endif

261
/* unistd.h */
262
#ifndef HAVE_GETPID
263
pid_t getpid (void) VLC_NOTHROW;
264 265
#endif

266 267 268 269
#ifndef HAVE_FSYNC
int fsync (int fd);
#endif

270 271 272 273
#ifndef HAVE_PATHCONF
long pathconf (const char *path, int name);
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
274 275
/* dirent.h */
#ifndef HAVE_DIRFD
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
276
int (dirfd) (DIR *);
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
277 278
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
279 280 281 282
#ifndef HAVE_FDOPENDIR
DIR *fdopendir (int);
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
283 284 285 286
#ifdef __cplusplus
} /* extern "C" */
#endif

287
/* stdlib.h */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
288 289 290 291 292 293 294 295
#ifndef HAVE_GETENV
static inline char *getenv (const char *name)
{
    (void)name;
    return NULL;
}
#endif

296 297 298 299 300
#ifndef HAVE_SETENV
int setenv (const char *, const char *, int);
int unsetenv (const char *);
#endif

301 302
#ifndef HAVE_ALIGNED_ALLOC
void *aligned_alloc(size_t, size_t);
303 304
#endif

305 306 307 308 309 310 311 312
#if defined (_WIN32) && defined(__MINGW32__)
#define aligned_free(ptr)  __mingw_aligned_free(ptr)
#elif defined (_WIN32) && defined(_MSC_VER)
#define aligned_free(ptr)  _aligned_free(ptr)
#else
#define aligned_free(ptr)  free(ptr)
#endif

313 314 315 316
#if defined(__native_client__) && defined(__cplusplus)
# define HAVE_USELOCALE
#endif

317 318 319 320 321
#if !defined(HAVE_NEWLOCALE) && defined(HAVE_CXX_LOCALE_T) && defined(__cplusplus)
# include <locale>
# define HAVE_NEWLOCALE
#endif

322
/* locale.h */
323
#ifndef HAVE_USELOCALE
324 325 326 327 328
# ifndef HAVE_NEWLOCALE
#  define LC_ALL_MASK      0
#  define LC_NUMERIC_MASK  0
#  define LC_MESSAGES_MASK 0
#  define LC_GLOBAL_LOCALE ((locale_t)(uintptr_t)1)
329
typedef void *locale_t;
330

331 332
static inline void freelocale(locale_t loc)
{
333
    (void)loc;
334
}
335
static inline locale_t newlocale(int mask, const char * locale, locale_t base)
336
{
337
    (void)mask; (void)locale; (void)base;
338 339
    return NULL;
}
340 341 342 343 344 345 346 347 348
# else
#  include <locale.h>
# endif

static inline locale_t uselocale(locale_t loc)
{
    (void)loc;
    return NULL;
}
349 350
#endif

351
#if !defined (HAVE_STATIC_ASSERT) && !defined(__cpp_static_assert)
Thomas Guillem's avatar
Thomas Guillem committed
352 353 354
# define STATIC_ASSERT_CONCAT_(a, b) a##b
# define STATIC_ASSERT_CONCAT(a, b) STATIC_ASSERT_CONCAT_(a, b)
# define _Static_assert(x, s) extern char STATIC_ASSERT_CONCAT(static_assert_, __LINE__)[sizeof(struct { unsigned:-!(x); })]
355 356 357
# define static_assert _Static_assert
#endif

358
/* libintl support */
359 360
#define _(str)            vlc_gettext (str)
#define N_(str)           gettext_noop (str)
361 362
#define gettext_noop(str) (str)

363 364 365 366
#ifdef __cplusplus
extern "C" {
#endif

367 368 369 370
#ifndef HAVE_SWAB
void swab (const void *, void *, ssize_t);
#endif

371 372
/* Socket stuff */
#ifndef HAVE_INET_PTON
373
# ifndef _WIN32
374
#  include <sys/socket.h>
375
#else
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
376
typedef int socklen_t;
377
# endif
378
int inet_pton(int, const char *, void *);
379
const char *inet_ntop(int, const void *, char *, socklen_t);
380 381
#endif

382 383 384 385 386
/* NaCl has a broken netinet/tcp.h, so TCP_NODELAY is not set */
#if defined(__native_client__) && !defined( HAVE_NETINET_TCP_H )
#  define TCP_NODELAY 1
#endif

387
#ifndef HAVE_STRUCT_POLLFD
388 389
enum
{
390 391 392 393 394 395 396 397
    POLLERR=0x1,
    POLLHUP=0x2,
    POLLNVAL=0x4,
    POLLWRNORM=0x10,
    POLLWRBAND=0x20,
    POLLRDNORM=0x100,
    POLLRDBAND=0x200,
    POLLPRI=0x400,
398
};
399 400
#define POLLIN  (POLLRDNORM|POLLRDBAND)
#define POLLOUT (POLLWRNORM|POLLWRBAND)
401 402 403 404 405 406 407

struct pollfd
{
    int fd;
    unsigned events;
    unsigned revents;
};
408
#endif
409 410 411 412
#ifndef HAVE_POLL
struct pollfd;
int poll (struct pollfd *, unsigned, int);
#endif
413

414
#ifndef HAVE_IF_NAMEINDEX
415
#include <errno.h>
416 417 418 419 420 421 422 423 424
struct if_nameindex
{
    unsigned if_index;
    char    *if_name;
};
# define if_nameindex()         (errno = ENOBUFS, NULL)
# define if_freenameindex(list) (void)0
#endif

425 426 427 428 429 430 431
#ifndef HAVE_STRUCT_TIMESPEC
struct timespec {
    time_t  tv_sec;   /* Seconds */
    long    tv_nsec;  /* Nanoseconds */
};
#endif

432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450
#ifdef _WIN32
struct iovec
{
    void  *iov_base;
    size_t iov_len;
};
#define IOV_MAX 255
struct msghdr
{
    void         *msg_name;
    size_t        msg_namelen;
    struct iovec *msg_iov;
    size_t        msg_iovlen;
    void         *msg_control;
    size_t        msg_controllen;
    int           msg_flags;
};
#endif

451 452 453 454
#ifdef _NEWLIB_VERSION
#define IOV_MAX 255
#endif

455 456 457 458 459
#ifndef HAVE_RECVMSG
struct msghdr;
ssize_t recvmsg(int, struct msghdr *, int);
#endif

460 461 462 463 464
#ifndef HAVE_SENDMSG
struct msghdr;
ssize_t sendmsg(int, const struct msghdr *, int);
#endif

465
/* search.h */
466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486
#ifndef HAVE_SEARCH_H
typedef struct entry {
    char *key;
    void *data;
} ENTRY;

typedef enum {
    FIND, ENTER
} ACTION;

typedef enum {
    preorder,
    postorder,
    endorder,
    leaf
} VISIT;

void *tsearch( const void *key, void **rootp, int(*cmp)(const void *, const void *) );
void *tfind( const void *key, const void **rootp, int(*cmp)(const void *, const void *) );
void *tdelete( const void *key, void **rootp, int(*cmp)(const void *, const void *) );
void twalk( const void *root, void(*action)(const void *nodep, VISIT which, int depth) );
487 488
#endif /* HAVE_SEARCH_H */
#ifndef HAVE_TDESTROY
489
void tdestroy( void *root, void (*free_node)(void *nodep) );
490 491
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
492 493
/* Random numbers */
#ifndef HAVE_NRAND48
494 495
double erand48 (unsigned short subi[3]);
long jrand48 (unsigned short subi[3]);
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
496 497 498
long nrand48 (unsigned short subi[3]);
#endif

499 500
#ifdef __OS2__
# undef HAVE_FORK   /* Implementation of fork() is imperfect on OS/2 */
501

502 503 504 505
# define SHUT_RD    0
# define SHUT_WR    1
# define SHUT_RDWR  2

506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
/* GAI error codes */
# ifndef EAI_BADFLAGS
#  define EAI_BADFLAGS -1
# endif
# ifndef EAI_NONAME
#  define EAI_NONAME -2
# endif
# ifndef EAI_AGAIN
#  define EAI_AGAIN -3
# endif
# ifndef EAI_FAIL
#  define EAI_FAIL -4
# endif
# ifndef EAI_NODATA
#  define EAI_NODATA -5
# endif
# ifndef EAI_FAMILY
#  define EAI_FAMILY -6
# endif
# ifndef EAI_SOCKTYPE
#  define EAI_SOCKTYPE -7
# endif
# ifndef EAI_SERVICE
#  define EAI_SERVICE -8
# endif
# ifndef EAI_ADDRFAMILY
#  define EAI_ADDRFAMILY -9
# endif
# ifndef EAI_MEMORY
#  define EAI_MEMORY -10
# endif
# ifndef EAI_OVERFLOW
#  define EAI_OVERFLOW -11
# endif
# ifndef EAI_SYSTEM
#  define EAI_SYSTEM -12
# endif

544 545 546 547 548 549 550 551
# ifndef NI_NUMERICHOST
#  define NI_NUMERICHOST 0x01
#  define NI_NUMERICSERV 0x02
#  define NI_NOFQDN      0x04
#  define NI_NAMEREQD    0x08
#  define NI_DGRAM       0x10
# endif

552 553 554 555 556
# ifndef NI_MAXHOST
#  define NI_MAXHOST 1025
#  define NI_MAXSERV 32
# endif

557 558 559 560
# define AI_PASSIVE     1
# define AI_CANONNAME   2
# define AI_NUMERICHOST 4

561 562 563 564 565 566 567 568 569 570 571
struct addrinfo
{
    int ai_flags;
    int ai_family;
    int ai_socktype;
    int ai_protocol;
    size_t ai_addrlen;
    struct sockaddr *ai_addr;
    char *ai_canonname;
    struct addrinfo *ai_next;
};
572

573 574 575 576
const char *gai_strerror (int);

int  getaddrinfo  (const char *node, const char *service,
                   const struct addrinfo *hints, struct addrinfo **res);
577
void freeaddrinfo (struct addrinfo *res);
578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
int  getnameinfo  (const struct sockaddr *sa, socklen_t salen,
                   char *host, int hostlen, char *serv, int servlen,
                   int flags);

/* OS/2 does not support IPv6, yet. But declare these only for compilation */
# include <stdint.h>

struct in6_addr
{
    uint8_t s6_addr[16];
};

struct sockaddr_in6
{
    uint8_t         sin6_len;
    uint8_t         sin6_family;
    uint16_t        sin6_port;
    uint32_t        sin6_flowinfo;
    struct in6_addr sin6_addr;
    uint32_t        sin6_scope_id;
};

# define IN6_IS_ADDR_MULTICAST(a)   (((__const uint8_t *) (a))[0] == 0xff)

static const struct in6_addr in6addr_any =
    { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
604 605 606 607 608

# include <errno.h>
# ifndef EPROTO
#  define EPROTO (ELAST + 1)
# endif
609 610 611 612

# ifndef HAVE_IF_NAMETOINDEX
#  define if_nametoindex(name)  atoi(name)
# endif
613 614
#endif

615 616
/* math.h */

Thomas Guillem's avatar
Thomas Guillem committed
617
#ifndef HAVE_NANF
618 619 620
#define nanf(tagp) NAN
#endif

621 622 623 624 625
#ifndef HAVE_SINCOS
void sincos(double, double *, double *);
void sincosf(float, float *, float *);
#endif

626 627 628 629
#ifndef HAVE_REALPATH
char *realpath(const char * restrict pathname, char * restrict resolved_path);
#endif

630 631 632 633
#ifdef _WIN32
FILE *vlc_win32_tmpfile(void);
#endif

634 635 636 637 638
/* mingw-w64 has a broken IN6_IS_ADDR_MULTICAST macro */
#if defined(_WIN32) && defined(__MINGW64_VERSION_MAJOR)
# define IN6_IS_ADDR_MULTICAST IN6_IS_ADDR_MULTICAST
#endif

639 640 641 642
#ifdef __APPLE__
# define fdatasync fsync
#endif

643 644 645 646
#ifdef __cplusplus
} /* extern "C" */
#endif

647
#endif /* !LIBVLC_FIXUPS_H */