vlc_fixups.h 13.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
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_POSIX_MEMALIGN) || \
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
307
308
#ifndef HAVE_POSIX_MEMALIGN
int posix_memalign (void **, size_t, size_t);
#endif

309
310
311
312
#if defined(__native_client__) && defined(__cplusplus)
# define HAVE_USELOCALE
#endif

313
/* locale.h */
314
#ifndef HAVE_USELOCALE
315
#define LC_ALL_MASK      0
316
317
#define LC_NUMERIC_MASK  0
#define LC_MESSAGES_MASK 0
318
#define LC_GLOBAL_LOCALE ((locale_t)(uintptr_t)1)
319
typedef void *locale_t;
320
321
static inline locale_t uselocale(locale_t loc)
{
322
    (void)loc;
323
324
325
326
    return NULL;
}
static inline void freelocale(locale_t loc)
{
327
    (void)loc;
328
}
329
static inline locale_t newlocale(int mask, const char * locale, locale_t base)
330
{
331
    (void)mask; (void)locale; (void)base;
332
333
    return NULL;
}
334
335
#endif

336
#if !defined (HAVE_STATIC_ASSERT) && !defined(__cpp_static_assert)
Thomas Guillem's avatar
Thomas Guillem committed
337
338
339
# 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); })]
340
341
342
# define static_assert _Static_assert
#endif

343
/* libintl support */
344
345
#define _(str)            vlc_gettext (str)
#define N_(str)           gettext_noop (str)
346
347
#define gettext_noop(str) (str)

348
349
350
351
#ifdef __cplusplus
extern "C" {
#endif

352
353
354
355
#ifndef HAVE_SWAB
void swab (const void *, void *, ssize_t);
#endif

356
357
/* Socket stuff */
#ifndef HAVE_INET_PTON
358
359
# ifndef _WIN32
#  include <sys/socket.h>
Jean-Baptiste Kempf's avatar
Jean-Baptiste Kempf committed
360
361
#else
typedef int socklen_t;
362
# endif
363
int inet_pton(int, const char *, void *);
364
const char *inet_ntop(int, const void *, char *, socklen_t);
365
366
#endif

367
368
369
370
371
/* 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

372
#ifndef HAVE_STRUCT_POLLFD
373
374
enum
{
375
376
377
378
379
380
381
382
    POLLERR=0x1,
    POLLHUP=0x2,
    POLLNVAL=0x4,
    POLLWRNORM=0x10,
    POLLWRBAND=0x20,
    POLLRDNORM=0x100,
    POLLRDBAND=0x200,
    POLLPRI=0x400,
383
};
384
385
#define POLLIN  (POLLRDNORM|POLLRDBAND)
#define POLLOUT (POLLWRNORM|POLLWRBAND)
386
387
388
389
390
391
392

struct pollfd
{
    int fd;
    unsigned events;
    unsigned revents;
};
393
#endif
394
395
396
397
#ifndef HAVE_POLL
struct pollfd;
int poll (struct pollfd *, unsigned, int);
#endif
398

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
399
#ifndef HAVE_IF_NAMEINDEX
400
#include <errno.h>
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
401
402
403
404
405
struct if_nameindex
{
    unsigned if_index;
    char    *if_name;
};
406
407
408
# ifndef HAVE_IF_NAMETOINDEX
#  define if_nametoindex(name)   atoi(name)
# endif
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
409
410
411
412
# define if_nameindex()         (errno = ENOBUFS, NULL)
# define if_freenameindex(list) (void)0
#endif

413
414
415
416
417
418
419
#ifndef HAVE_STRUCT_TIMESPEC
struct timespec {
    time_t  tv_sec;   /* Seconds */
    long    tv_nsec;  /* Nanoseconds */
};
#endif

420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
#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

439
440
441
442
#ifdef _NEWLIB_VERSION
#define IOV_MAX 255
#endif

443
444
445
446
447
#ifndef HAVE_RECVMSG
struct msghdr;
ssize_t recvmsg(int, struct msghdr *, int);
#endif

448
449
450
451
452
#ifndef HAVE_SENDMSG
struct msghdr;
ssize_t sendmsg(int, const struct msghdr *, int);
#endif

453
/* search.h */
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
#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) );
ivoire's avatar
ivoire committed
476
477
#else // HAVE_SEARCH_H
# ifndef HAVE_TDESTROY
478
void vlc_tdestroy( void *, void (*)(void *) );
479
#  define tdestroy vlc_tdestroy
480
# endif
481
482
#endif

Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
483
484
/* Random numbers */
#ifndef HAVE_NRAND48
485
486
double erand48 (unsigned short subi[3]);
long jrand48 (unsigned short subi[3]);
Rémi Denis-Courmont's avatar
Rémi Denis-Courmont committed
487
488
489
long nrand48 (unsigned short subi[3]);
#endif

ivoire's avatar
ivoire committed
490
491
#ifdef __OS2__
# undef HAVE_FORK   /* Implementation of fork() is imperfect on OS/2 */
492

493
494
495
496
# define SHUT_RD    0
# define SHUT_WR    1
# define SHUT_RDWR  2

497
498
499
500
501
502
503
504
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
/* 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

535
536
537
538
539
540
541
542
# ifndef NI_NUMERICHOST
#  define NI_NUMERICHOST 0x01
#  define NI_NUMERICSERV 0x02
#  define NI_NOFQDN      0x04
#  define NI_NAMEREQD    0x08
#  define NI_DGRAM       0x10
# endif

543
544
545
546
547
# ifndef NI_MAXHOST
#  define NI_MAXHOST 1025
#  define NI_MAXSERV 32
# endif

548
549
550
551
# define AI_PASSIVE     1
# define AI_CANONNAME   2
# define AI_NUMERICHOST 4

552
553
554
555
556
557
558
559
560
561
562
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;
};
563

564
565
566
567
const char *gai_strerror (int);

int  getaddrinfo  (const char *node, const char *service,
                   const struct addrinfo *hints, struct addrinfo **res);
568
void freeaddrinfo (struct addrinfo *res);
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
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 } };
595
596
597
598
599

# include <errno.h>
# ifndef EPROTO
#  define EPROTO (ELAST + 1)
# endif
ivoire's avatar
ivoire committed
600
601
#endif

602
603
/* math.h */

Thomas Guillem's avatar
Thomas Guillem committed
604
#ifndef HAVE_NANF
605
606
607
#define nanf(tagp) NAN
#endif

608
609
610
611
612
#ifndef HAVE_SINCOS
void sincos(double, double *, double *);
void sincosf(float, float *, float *);
#endif

613
614
615
616
#ifndef HAVE_REALPATH
char *realpath(const char * restrict pathname, char * restrict resolved_path);
#endif

617
618
619
620
#ifdef _WIN32
FILE *vlc_win32_tmpfile(void);
#endif

621
622
623
624
625
/* 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

626
627
628
629
#ifdef __APPLE__
# define fdatasync fsync
#endif

630
631
632
633
#ifdef __cplusplus
} /* extern "C" */
#endif

634
#endif /* !LIBVLC_FIXUPS_H */