vlc_fixups.h 13.4 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
#ifndef HAVE_FFSLL
168
int ffsll(long long);
169 170
#endif

171 172 173 174
#ifndef HAVE_MEMRCHR
void *memrchr(const void *, int, size_t);
#endif

175 176 177 178 179 180 181 182 183 184 185 186
#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

187 188 189 190
#ifndef HAVE_STRVERSCMP
int strverscmp (const char *, const char *);
#endif

191
#ifndef HAVE_STRNLEN
192
size_t strnlen (const char *, size_t);
193 194
#endif

François Cartegnie's avatar
François Cartegnie committed
195 196 197 198
#ifndef HAVE_STRNSTR
char * strnstr (const char *, const char *, size_t);
#endif

199
#ifndef HAVE_STRNDUP
200
char *strndup (const char *, size_t);
201 202 203
#endif

#ifndef HAVE_STRLCPY
204
size_t strlcpy (char *, const char *, size_t);
205 206
#endif

207 208
#ifndef HAVE_STRSEP
char *strsep (char **, const char *);
209
#endif
210 211 212

#ifndef HAVE_STRTOK_R
char *strtok_r(char *, const char *, char **);
213
#endif
214

215
/* stdlib.h */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
216
#ifndef HAVE_ATOF
217
#ifndef __ANDROID__
218
double atof (const char *);
219
#endif
220
#endif
221

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
222
#ifndef HAVE_ATOLL
223
long long atoll (const char *);
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
224 225
#endif

226
#ifndef HAVE_LLDIV
227
lldiv_t lldiv (long long, long long);
228 229
#endif

230 231 232
#ifndef HAVE_STRTOF
#ifndef __ANDROID__
float strtof (const char *, char **);
233 234 235
#endif
#endif

236 237
#ifndef HAVE_STRTOLL
long long int strtoll (const char *, char **, int);
238 239
#endif

240
/* time.h */
241 242 243
#ifndef HAVE_GMTIME_R
struct tm *gmtime_r (const time_t *, struct tm *);
#endif
244

245 246 247
#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
248

249
#ifndef HAVE_TIMEGM
250
time_t timegm(struct tm *);
251 252
#endif

253 254
#ifndef HAVE_TIMESPEC_GET
#define TIME_UTC 1
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
255
struct timespec;
256 257 258
int timespec_get(struct timespec *, int);
#endif

259 260
/* sys/time.h */
#ifndef HAVE_GETTIMEOFDAY
261
struct timezone;
262 263 264
int gettimeofday(struct timeval *, struct timezone *);
#endif

265
/* unistd.h */
266
#ifndef HAVE_GETPID
267
pid_t getpid (void) VLC_NOTHROW;
268 269
#endif

270 271 272 273
#ifndef HAVE_FSYNC
int fsync (int fd);
#endif

274 275 276 277
#ifndef HAVE_PATHCONF
long pathconf (const char *path, int name);
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
278 279
/* dirent.h */
#ifndef HAVE_DIRFD
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
280
int (dirfd) (DIR *);
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
281 282
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
283 284 285 286
#ifndef HAVE_FDOPENDIR
DIR *fdopendir (int);
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
287 288 289 290
#ifdef __cplusplus
} /* extern "C" */
#endif

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

300 301 302 303 304
#ifndef HAVE_SETENV
int setenv (const char *, const char *, int);
int unsetenv (const char *);
#endif

305 306
#ifndef HAVE_ALIGNED_ALLOC
void *aligned_alloc(size_t, size_t);
307 308
#endif

309 310 311 312 313 314 315 316
#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

317 318 319 320
#if defined(__native_client__) && defined(__cplusplus)
# define HAVE_USELOCALE
#endif

321
/* locale.h */
322
#ifndef HAVE_USELOCALE
323
#define LC_ALL_MASK      0
324 325
#define LC_NUMERIC_MASK  0
#define LC_MESSAGES_MASK 0
326
#define LC_GLOBAL_LOCALE ((locale_t)(uintptr_t)1)
327
typedef void *locale_t;
328 329
static inline locale_t uselocale(locale_t loc)
{
330
    (void)loc;
331 332 333 334
    return NULL;
}
static inline void freelocale(locale_t loc)
{
335
    (void)loc;
336
}
337
static inline locale_t newlocale(int mask, const char * locale, locale_t base)
338
{
339
    (void)mask; (void)locale; (void)base;
340 341
    return NULL;
}
342 343
#endif

344
#if !defined (HAVE_STATIC_ASSERT) && !defined(__cpp_static_assert)
Thomas Guillem's avatar
Thomas Guillem committed
345 346 347
# 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); })]
348 349 350
# define static_assert _Static_assert
#endif

351
/* libintl support */
352 353
#define _(str)            vlc_gettext (str)
#define N_(str)           gettext_noop (str)
354 355
#define gettext_noop(str) (str)

356 357 358 359
#ifdef __cplusplus
extern "C" {
#endif

360 361 362 363
#ifndef HAVE_SWAB
void swab (const void *, void *, ssize_t);
#endif

364 365
/* Socket stuff */
#ifndef HAVE_INET_PTON
366 367
# ifndef _WIN32
#  include <sys/socket.h>
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
368 369
#else
typedef int socklen_t;
370
# endif
371
int inet_pton(int, const char *, void *);
372
const char *inet_ntop(int, const void *, char *, socklen_t);
373 374
#endif

375 376 377 378 379
/* 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

380
#ifndef HAVE_STRUCT_POLLFD
381 382
enum
{
383 384 385 386 387 388 389 390
    POLLERR=0x1,
    POLLHUP=0x2,
    POLLNVAL=0x4,
    POLLWRNORM=0x10,
    POLLWRBAND=0x20,
    POLLRDNORM=0x100,
    POLLRDBAND=0x200,
    POLLPRI=0x400,
391
};
392 393
#define POLLIN  (POLLRDNORM|POLLRDBAND)
#define POLLOUT (POLLWRNORM|POLLWRBAND)
394 395 396 397 398 399 400

struct pollfd
{
    int fd;
    unsigned events;
    unsigned revents;
};
401
#endif
402 403 404 405
#ifndef HAVE_POLL
struct pollfd;
int poll (struct pollfd *, unsigned, int);
#endif
406

407
#ifndef HAVE_IF_NAMEINDEX
408
#include <errno.h>
409 410 411 412 413
struct if_nameindex
{
    unsigned if_index;
    char    *if_name;
};
414 415 416
# ifndef HAVE_IF_NAMETOINDEX
#  define if_nametoindex(name)   atoi(name)
# endif
417 418 419 420
# define if_nameindex()         (errno = ENOBUFS, NULL)
# define if_freenameindex(list) (void)0
#endif

421 422 423 424 425 426 427
#ifndef HAVE_STRUCT_TIMESPEC
struct timespec {
    time_t  tv_sec;   /* Seconds */
    long    tv_nsec;  /* Nanoseconds */
};
#endif

428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
#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

447 448 449 450
#ifdef _NEWLIB_VERSION
#define IOV_MAX 255
#endif

451 452 453 454 455
#ifndef HAVE_RECVMSG
struct msghdr;
ssize_t recvmsg(int, struct msghdr *, int);
#endif

456 457 458 459 460
#ifndef HAVE_SENDMSG
struct msghdr;
ssize_t sendmsg(int, const struct msghdr *, int);
#endif

461
/* search.h */
462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
#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) );
void tdestroy( void *root, void (*free_node)(void *nodep) );
Rémi Duraffort's avatar
Rémi Duraffort committed
484 485
#else // HAVE_SEARCH_H
# ifndef HAVE_TDESTROY
486
void vlc_tdestroy( void *, void (*)(void *) );
487
#  define tdestroy vlc_tdestroy
488
# endif
489 490
#endif

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

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

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

505 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
/* 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

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

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

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

560 561 562 563 564 565 566 567 568 569 570
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;
};
571

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

int  getaddrinfo  (const char *node, const char *service,
                   const struct addrinfo *hints, struct addrinfo **res);
576
void freeaddrinfo (struct addrinfo *res);
577 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
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 } };
603 604 605 606 607

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

610 611
/* math.h */

Thomas Guillem's avatar
Thomas Guillem committed
612
#ifndef HAVE_NANF
613 614 615
#define nanf(tagp) NAN
#endif

616 617 618 619 620
#ifndef HAVE_SINCOS
void sincos(double, double *, double *);
void sincosf(float, float *, float *);
#endif

621 622 623 624
#ifndef HAVE_REALPATH
char *realpath(const char * restrict pathname, char * restrict resolved_path);
#endif

625 626 627 628
#ifdef _WIN32
FILE *vlc_win32_tmpfile(void);
#endif

629 630 631 632 633
/* 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

634 635 636 637
#ifdef __APPLE__
# define fdatasync fsync
#endif

638 639 640 641
#ifdef __cplusplus
} /* extern "C" */
#endif

642
#endif /* !LIBVLC_FIXUPS_H */