vlc_fixups.h 11.2 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__))
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
#if !defined (HAVE_GMTIME_R) || !defined (HAVE_LOCALTIME_R) \
 || !defined (HAVE_TIMEGM)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
50 51 52
# include <time.h> /* time_t */
#endif

53 54 55 56 57 58 59 60
#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
61 62 63 64 65 66 67 68
#ifndef HAVE_LLDIV
typedef struct
{
    long long quot; /* Quotient. */
    long long rem;  /* Remainder. */
} lldiv_t;
#endif

69 70
#if !defined(HAVE_GETENV) || \
    !defined(HAVE_USELOCALE)
Rafaël Carré's avatar
Rafaël Carré committed
71
# include <stddef.h> /* NULL */
72 73
#endif

74
#if !defined (HAVE_REWIND) || \
75
    !defined (HAVE_GETDELIM)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
76 77 78
# include <stdio.h> /* FILE */
#endif

79
#if !defined (HAVE_POSIX_MEMALIGN) || \
80
    !defined (HAVE_MEMRCHR) || \
81
    !defined (HAVE_STRLCPY) || \
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
82
    !defined (HAVE_STRNDUP) || \
83 84
    !defined (HAVE_STRNLEN) || \
    !defined (HAVE_STRNSTR)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
85 86 87 88 89 90 91
# include <stddef.h> /* size_t */
#endif

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

92
#if !defined (HAVE_GETDELIM) || \
93 94 95
    !defined (HAVE_GETPID)   || \
    !defined (HAVE_SWAB)
# include <sys/types.h> /* ssize_t, pid_t */
96 97
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
98 99
#if !defined (HAVE_DIRFD) || \
    !defined (HAVE_FDOPENDIR)
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
100 101 102
# include <dirent.h>
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
103
#ifdef __cplusplus
104
# define VLC_NOTHROW throw ()
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
105
extern "C" {
106 107
#else
# define VLC_NOTHROW
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
108 109
#endif

110
/* stddef.h */
111
#if !defined (__cplusplus) && !defined (HAVE_MAX_ALIGN_T)
112 113 114 115 116 117
typedef struct {
  long long ll;
  long double ld;
} max_align_t;
#endif

118 119 120 121 122
/* stdio.h */
#ifndef HAVE_ASPRINTF
int asprintf (char **, const char *, ...);
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
123 124 125 126 127 128 129 130 131
#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

132
#ifndef HAVE_GETDELIM
133 134 135 136 137 138
ssize_t getdelim (char **, size_t *, int, FILE *);
ssize_t getline (char **, size_t *, FILE *);
#endif

#ifndef HAVE_REWIND
void rewind (FILE *);
139 140 141
#endif

#ifndef HAVE_VASPRINTF
142
int vasprintf (char **, const char *, va_list);
143 144
#endif

145
/* string.h */
146
#ifndef HAVE_FFSLL
147
int ffsll(long long);
148 149
#endif

150 151 152 153
#ifndef HAVE_MEMRCHR
void *memrchr(const void *, int, size_t);
#endif

154 155 156 157 158 159 160 161 162 163 164 165
#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

166 167 168 169
#ifndef HAVE_STRVERSCMP
int strverscmp (const char *, const char *);
#endif

170
#ifndef HAVE_STRNLEN
171
size_t strnlen (const char *, size_t);
172 173
#endif

François Cartegnie's avatar
François Cartegnie committed
174 175 176 177
#ifndef HAVE_STRNSTR
char * strnstr (const char *, const char *, size_t);
#endif

178
#ifndef HAVE_STRNDUP
179
char *strndup (const char *, size_t);
180 181 182
#endif

#ifndef HAVE_STRLCPY
183
size_t strlcpy (char *, const char *, size_t);
184 185
#endif

186 187
#ifndef HAVE_STRSEP
char *strsep (char **, const char *);
188
#endif
189 190 191

#ifndef HAVE_STRTOK_R
char *strtok_r(char *, const char *, char **);
192
#endif
193

194
/* stdlib.h */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
195
#ifndef HAVE_ATOF
196
#ifndef __ANDROID__
197
double atof (const char *);
198
#endif
199
#endif
200

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
201
#ifndef HAVE_ATOLL
202
long long atoll (const char *);
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
203 204
#endif

205
#ifndef HAVE_LLDIV
206
lldiv_t lldiv (long long, long long);
207 208
#endif

209 210 211
#ifndef HAVE_STRTOF
#ifndef __ANDROID__
float strtof (const char *, char **);
212 213 214
#endif
#endif

215 216
#ifndef HAVE_STRTOLL
long long int strtoll (const char *, char **, int);
217 218
#endif

219
/* time.h */
220 221 222
#ifndef HAVE_GMTIME_R
struct tm *gmtime_r (const time_t *, struct tm *);
#endif
223

224 225 226
#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
227

228
#ifndef HAVE_TIMEGM
229
time_t timegm(struct tm *);
230 231
#endif

232 233
#ifndef HAVE_TIMESPEC_GET
#define TIME_UTC 1
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
234
struct timespec;
235 236 237
int timespec_get(struct timespec *, int);
#endif

238 239
/* sys/time.h */
#ifndef HAVE_GETTIMEOFDAY
240
struct timezone;
241 242 243
int gettimeofday(struct timeval *, struct timezone *);
#endif

244
/* unistd.h */
245
#ifndef HAVE_GETPID
246
pid_t getpid (void) VLC_NOTHROW;
247 248
#endif

249 250 251 252
#ifndef HAVE_FSYNC
int fsync (int fd);
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
253 254
/* dirent.h */
#ifndef HAVE_DIRFD
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
255
int (dirfd) (DIR *);
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
256 257
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
258 259 260 261
#ifndef HAVE_FDOPENDIR
DIR *fdopendir (int);
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
262 263 264 265
#ifdef __cplusplus
} /* extern "C" */
#endif

266
/* stdlib.h */
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
267 268 269 270 271 272 273 274
#ifndef HAVE_GETENV
static inline char *getenv (const char *name)
{
    (void)name;
    return NULL;
}
#endif

275 276 277 278 279
#ifndef HAVE_SETENV
int setenv (const char *, const char *, int);
int unsetenv (const char *);
#endif

280 281 282 283
#ifndef HAVE_POSIX_MEMALIGN
int posix_memalign (void **, size_t, size_t);
#endif

284 285 286 287
#if defined(__native_client__) && defined(__cplusplus)
# define HAVE_USELOCALE
#endif

288
/* locale.h */
289
#ifndef HAVE_USELOCALE
290
#define LC_ALL_MASK      0
291 292
#define LC_NUMERIC_MASK  0
#define LC_MESSAGES_MASK 0
293
#define LC_GLOBAL_LOCALE ((locale_t)(uintptr_t)1)
294
typedef void *locale_t;
295 296
static inline locale_t uselocale(locale_t loc)
{
297
    (void)loc;
298 299 300 301
    return NULL;
}
static inline void freelocale(locale_t loc)
{
302
    (void)loc;
303
}
304
static inline locale_t newlocale(int mask, const char * locale, locale_t base)
305
{
306
    (void)mask; (void)locale; (void)base;
307 308
    return NULL;
}
309 310
#endif

311
#if !defined (HAVE_STATIC_ASSERT) && !defined(__cpp_static_assert)
Thomas Guillem's avatar
Thomas Guillem committed
312 313 314
# 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); })]
315 316 317
# define static_assert _Static_assert
#endif

318
/* libintl support */
319 320
#define _(str)            vlc_gettext (str)
#define N_(str)           gettext_noop (str)
321 322
#define gettext_noop(str) (str)

323 324 325 326
#ifdef __cplusplus
extern "C" {
#endif

327 328 329 330
#ifndef HAVE_SWAB
void swab (const void *, void *, ssize_t);
#endif

331 332
/* Socket stuff */
#ifndef HAVE_INET_PTON
333 334
# ifndef _WIN32
#  include <sys/socket.h>
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
335 336
#else
typedef int socklen_t;
337
# endif
338
int inet_pton(int, const char *, void *);
339
const char *inet_ntop(int, const void *, char *, socklen_t);
340 341
#endif

342
#ifndef HAVE_STRUCT_POLLFD
343 344
enum
{
345 346 347 348 349 350 351 352
    POLLERR=0x1,
    POLLHUP=0x2,
    POLLNVAL=0x4,
    POLLWRNORM=0x10,
    POLLWRBAND=0x20,
    POLLRDNORM=0x100,
    POLLRDBAND=0x200,
    POLLPRI=0x400,
353
};
354 355
#define POLLIN  (POLLRDNORM|POLLRDBAND)
#define POLLOUT (POLLWRNORM|POLLWRBAND)
356 357 358 359 360 361 362

struct pollfd
{
    int fd;
    unsigned events;
    unsigned revents;
};
363
#endif
364 365 366 367
#ifndef HAVE_POLL
struct pollfd;
int poll (struct pollfd *, unsigned, int);
#endif
368

369
#ifndef HAVE_IF_NAMEINDEX
370
#include <errno.h>
371 372 373 374 375
struct if_nameindex
{
    unsigned if_index;
    char    *if_name;
};
376 377 378
# ifndef HAVE_IF_NAMETOINDEX
#  define if_nametoindex(name)   atoi(name)
# endif
379 380 381 382
# define if_nameindex()         (errno = ENOBUFS, NULL)
# define if_freenameindex(list) (void)0
#endif

383 384 385 386 387 388 389
#ifndef HAVE_STRUCT_TIMESPEC
struct timespec {
    time_t  tv_sec;   /* Seconds */
    long    tv_nsec;  /* Nanoseconds */
};
#endif

390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
#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

409 410 411 412 413
#ifndef HAVE_RECVMSG
struct msghdr;
ssize_t recvmsg(int, struct msghdr *, int);
#endif

414 415 416 417 418
#ifndef HAVE_SENDMSG
struct msghdr;
ssize_t sendmsg(int, const struct msghdr *, int);
#endif

419
/* search.h */
420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441
#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
442 443
#else // HAVE_SEARCH_H
# ifndef HAVE_TDESTROY
444
void vlc_tdestroy( void *, void (*)(void *) );
445
#  define tdestroy vlc_tdestroy
446
# endif
447 448
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
449 450
/* Random numbers */
#ifndef HAVE_NRAND48
451 452
double erand48 (unsigned short subi[3]);
long jrand48 (unsigned short subi[3]);
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
453 454 455
long nrand48 (unsigned short subi[3]);
#endif

456 457
#ifdef __OS2__
# undef HAVE_FORK   /* Implementation of fork() is imperfect on OS/2 */
458

459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501
/* 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

# ifndef NI_MAXHOST
#  define NI_MAXHOST 1025
#  define NI_MAXSERV 32
# endif

502 503 504 505 506 507 508 509 510 511 512
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;
};
513 514

void freeaddrinfo (struct addrinfo *res);
515 516 517 518 519

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

522 523
/* math.h */

Thomas Guillem's avatar
Thomas Guillem committed
524
#ifndef HAVE_NANF
525 526 527
#define nanf(tagp) NAN
#endif

528 529 530 531 532
#ifndef HAVE_SINCOS
void sincos(double, double *, double *);
void sincosf(float, float *, float *);
#endif

533 534 535 536
#ifndef HAVE_REALPATH
char *realpath(const char * restrict pathname, char * restrict resolved_path);
#endif

537 538 539 540
#ifdef _WIN32
FILE *vlc_win32_tmpfile(void);
#endif

541 542 543 544 545
/* 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

546 547 548 549
#ifdef __APPLE__
# define fdatasync fsync
#endif

550 551 552 553
#ifdef __cplusplus
} /* extern "C" */
#endif

554
#endif /* !LIBVLC_FIXUPS_H */