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
22e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root/* Compatibility definitions for non-Linux (i.e., BSD-based) hosts. */
23e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root#ifndef HAVE_OFF64_T
24e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root#if _FILE_OFFSET_BITS < 64
25e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root#error "_FILE_OFFSET_BITS < 64; large files are not supported on this platform"
26e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root#endif /* _FILE_OFFSET_BITS < 64 */
27e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
28e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Roottypedef off_t off64_t;
29e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
30e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Rootstatic inline off64_t lseek64(int fd, off64_t offset, int whence) {
31e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root    return lseek(fd, offset, whence);
32e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root}
33e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
34e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root#ifdef HAVE_PREAD
35e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Rootstatic inline ssize_t pread64(int fd, void* buf, size_t nbytes, off64_t offset) {
36e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root    return pread(fd, buf, nbytes, offset);
37e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root}
38e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root#endif
39e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
40e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root#endif /* !HAVE_OFF64_T */
41e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root
42b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#if HAVE_PRINTF_ZD
43b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#  define ZD "%zd"
44b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#  define ZD_TYPE ssize_t
45b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#else
46b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#  define ZD "%ld"
47b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#  define ZD_TYPE long
48b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#endif
49b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root
50b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root/*
51b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root * TEMP_FAILURE_RETRY is defined by some, but not all, versions of
52b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root * <unistd.h>. (Alas, it is not as standard as we'd hoped!) So, if it's
53b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root * not already defined, then define it here.
54b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root */
55b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#ifndef TEMP_FAILURE_RETRY
56b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root/* Used to retry syscalls that can return EINTR. */
57b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#define TEMP_FAILURE_RETRY(exp) ({         \
58b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root    typeof (exp) _rc;                      \
59b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root    do {                                   \
60b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root        _rc = (exp);                       \
61b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root    } while (_rc == -1 && errno == EINTR); \
62b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root    _rc; })
63b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root#endif
64b9fd6f986492d74125274722b8ea1a3819cd216aKenny Root
65e2fa7dc58eaf34f30b89350d143d97fd4a501199Kenny Root#endif /* __LIB_UTILS_COMPAT_H */
66