118092ddc866425598abf4521d9ed4eda9573fdaaKenny Root/*
218092ddc866425598abf4521d9ed4eda9573fdaaKenny Root * Copyright (C) 2010 The Android Open Source Project
318092ddc866425598abf4521d9ed4eda9573fdaaKenny Root *
418092ddc866425598abf4521d9ed4eda9573fdaaKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
518092ddc866425598abf4521d9ed4eda9573fdaaKenny Root * you may not use this file except in compliance with the License.
618092ddc866425598abf4521d9ed4eda9573fdaaKenny Root * You may obtain a copy of the License at
718092ddc866425598abf4521d9ed4eda9573fdaaKenny Root *
818092ddc866425598abf4521d9ed4eda9573fdaaKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
918092ddc866425598abf4521d9ed4eda9573fdaaKenny Root *
1018092ddc866425598abf4521d9ed4eda9573fdaaKenny Root * Unless required by applicable law or agreed to in writing, software
1118092ddc866425598abf4521d9ed4eda9573fdaaKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1218092ddc866425598abf4521d9ed4eda9573fdaaKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1318092ddc866425598abf4521d9ed4eda9573fdaaKenny Root * See the License for the specific language governing permissions and
1418092ddc866425598abf4521d9ed4eda9573fdaaKenny Root * limitations under the License.
1518092ddc866425598abf4521d9ed4eda9573fdaaKenny Root */
1618092ddc866425598abf4521d9ed4eda9573fdaaKenny Root
1718092ddc866425598abf4521d9ed4eda9573fdaaKenny Root#ifndef __LIB_UTILS_COMPAT_H
1818092ddc866425598abf4521d9ed4eda9573fdaaKenny Root#define __LIB_UTILS_COMPAT_H
1918092ddc866425598abf4521d9ed4eda9573fdaaKenny Root
2018092ddc866425598abf4521d9ed4eda9573fdaaKenny Root#include <unistd.h>
2118092ddc866425598abf4521d9ed4eda9573fdaaKenny Root
2218092ddc866425598abf4521d9ed4eda9573fdaaKenny Root/* Compatibility definitions for non-Linux (i.e., BSD-based) hosts. */
2318092ddc866425598abf4521d9ed4eda9573fdaaKenny Root#ifndef HAVE_OFF64_T
2418092ddc866425598abf4521d9ed4eda9573fdaaKenny Root#if _FILE_OFFSET_BITS < 64
2518092ddc866425598abf4521d9ed4eda9573fdaaKenny Root#error "_FILE_OFFSET_BITS < 64; large files are not supported on this platform"
2618092ddc866425598abf4521d9ed4eda9573fdaaKenny Root#endif /* _FILE_OFFSET_BITS < 64 */
2718092ddc866425598abf4521d9ed4eda9573fdaaKenny Root
2818092ddc866425598abf4521d9ed4eda9573fdaaKenny Roottypedef off_t off64_t;
2918092ddc866425598abf4521d9ed4eda9573fdaaKenny Root
3018092ddc866425598abf4521d9ed4eda9573fdaaKenny Rootstatic inline off64_t lseek64(int fd, off64_t offset, int whence) {
3118092ddc866425598abf4521d9ed4eda9573fdaaKenny Root    return lseek(fd, offset, whence);
3218092ddc866425598abf4521d9ed4eda9573fdaaKenny Root}
3318092ddc866425598abf4521d9ed4eda9573fdaaKenny Root
3418092ddc866425598abf4521d9ed4eda9573fdaaKenny Root#ifdef HAVE_PREAD
3518092ddc866425598abf4521d9ed4eda9573fdaaKenny Rootstatic inline ssize_t pread64(int fd, void* buf, size_t nbytes, off64_t offset) {
3618092ddc866425598abf4521d9ed4eda9573fdaaKenny Root    return pread(fd, buf, nbytes, offset);
3718092ddc866425598abf4521d9ed4eda9573fdaaKenny Root}
3818092ddc866425598abf4521d9ed4eda9573fdaaKenny Root#endif
3918092ddc866425598abf4521d9ed4eda9573fdaaKenny Root
4018092ddc866425598abf4521d9ed4eda9573fdaaKenny Root#endif /* !HAVE_OFF64_T */
4118092ddc866425598abf4521d9ed4eda9573fdaaKenny Root
42d611117f246213ee4bb183a3015c1fd79593074bKenny Root#if HAVE_PRINTF_ZD
43d611117f246213ee4bb183a3015c1fd79593074bKenny Root#  define ZD "%zd"
44d611117f246213ee4bb183a3015c1fd79593074bKenny Root#  define ZD_TYPE ssize_t
45d611117f246213ee4bb183a3015c1fd79593074bKenny Root#else
46d611117f246213ee4bb183a3015c1fd79593074bKenny Root#  define ZD "%ld"
47d611117f246213ee4bb183a3015c1fd79593074bKenny Root#  define ZD_TYPE long
48d611117f246213ee4bb183a3015c1fd79593074bKenny Root#endif
49d611117f246213ee4bb183a3015c1fd79593074bKenny Root
50d611117f246213ee4bb183a3015c1fd79593074bKenny Root/*
51d611117f246213ee4bb183a3015c1fd79593074bKenny Root * TEMP_FAILURE_RETRY is defined by some, but not all, versions of
52d611117f246213ee4bb183a3015c1fd79593074bKenny Root * <unistd.h>. (Alas, it is not as standard as we'd hoped!) So, if it's
53d611117f246213ee4bb183a3015c1fd79593074bKenny Root * not already defined, then define it here.
54d611117f246213ee4bb183a3015c1fd79593074bKenny Root */
55d611117f246213ee4bb183a3015c1fd79593074bKenny Root#ifndef TEMP_FAILURE_RETRY
56d611117f246213ee4bb183a3015c1fd79593074bKenny Root/* Used to retry syscalls that can return EINTR. */
57d611117f246213ee4bb183a3015c1fd79593074bKenny Root#define TEMP_FAILURE_RETRY(exp) ({         \
58d611117f246213ee4bb183a3015c1fd79593074bKenny Root    typeof (exp) _rc;                      \
59d611117f246213ee4bb183a3015c1fd79593074bKenny Root    do {                                   \
60d611117f246213ee4bb183a3015c1fd79593074bKenny Root        _rc = (exp);                       \
61d611117f246213ee4bb183a3015c1fd79593074bKenny Root    } while (_rc == -1 && errno == EINTR); \
62d611117f246213ee4bb183a3015c1fd79593074bKenny Root    _rc; })
63d611117f246213ee4bb183a3015c1fd79593074bKenny Root#endif
64d611117f246213ee4bb183a3015c1fd79593074bKenny Root
6518092ddc866425598abf4521d9ed4eda9573fdaaKenny Root#endif /* __LIB_UTILS_COMPAT_H */
66