Compat.h revision cb3d65323d69ee1c101a1fa04e0d0e0929ef0f4f
1e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root/*
2e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root * Copyright (C) 2010 The Android Open Source Project
3e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root *
4e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root * you may not use this file except in compliance with the License.
6e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root * You may obtain a copy of the License at
7e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root *
8e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root *
10e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root * Unless required by applicable law or agreed to in writing, software
11e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root * See the License for the specific language governing permissions and
14e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root * limitations under the License.
15e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root */
16e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
17e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root#ifndef __LIB_UTILS_COMPAT_H
18e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root#define __LIB_UTILS_COMPAT_H
19e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
20e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root#include <unistd.h>
21e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
22cb3d65323d69ee1c101a1fa04e0d0e0929ef0f4fElliott Hughes#if defined(__APPLE__)
23cb3d65323d69ee1c101a1fa04e0d0e0929ef0f4fElliott Hughes
24cb3d65323d69ee1c101a1fa04e0d0e0929ef0f4fElliott Hughes/* Mac OS has always had a 64-bit off_t, so it doesn't have off64_t. */
25e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
26e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Roottypedef off_t off64_t;
27e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
28e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Rootstatic inline off64_t lseek64(int fd, off64_t offset, int whence) {
29e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root    return lseek(fd, offset, whence);
30e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root}
31e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
32e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Rootstatic inline ssize_t pread64(int fd, void* buf, size_t nbytes, off64_t offset) {
33e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root    return pread(fd, buf, nbytes, offset);
34e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root}
35e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
36cb3d65323d69ee1c101a1fa04e0d0e0929ef0f4fElliott Hughes#endif /* __APPLE__ */
37e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
38b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#if HAVE_PRINTF_ZD
39b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#  define ZD "%zd"
40b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#  define ZD_TYPE ssize_t
41b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#else
42b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#  define ZD "%ld"
43b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#  define ZD_TYPE long
44b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#endif
45b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root
46b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root/*
47b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root * TEMP_FAILURE_RETRY is defined by some, but not all, versions of
48b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root * <unistd.h>. (Alas, it is not as standard as we'd hoped!) So, if it's
49b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root * not already defined, then define it here.
50b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root */
51b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#ifndef TEMP_FAILURE_RETRY
52b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root/* Used to retry syscalls that can return EINTR. */
53b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#define TEMP_FAILURE_RETRY(exp) ({         \
54b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root    typeof (exp) _rc;                      \
55b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root    do {                                   \
56b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root        _rc = (exp);                       \
57b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root    } while (_rc == -1 && errno == EINTR); \
58b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root    _rc; })
59b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#endif
60b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root
61e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root#endif /* __LIB_UTILS_COMPAT_H */
62