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