165b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng/* 265b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * Copyright 2013, The Android Open Source Project 365b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * 465b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 565b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * you may not use this file except in compliance with the License. 665b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * You may obtain a copy of the License at 765b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * 865b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * http://www.apache.org/licenses/LICENSE-2.0 965b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * 1065b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * Unless required by applicable law or agreed to in writing, software 1165b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * distributed under the License is distributed on an "AS IS" BASIS, 1265b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * See the License for the specific language governing permissions and 1465b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng * limitations under the License. 1565b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng */ 1665b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 1765b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#ifndef ANDROID_FIXUP_H 1865b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#define ANDROID_FIXUP_H 1965b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 2065b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#define loff_t off_t 2165b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#define off64_t off_t 2265b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 2365b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#include <string.h> 2465b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#include <stdarg.h> 2565b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#include <stdlib.h> 2665b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#include <stdio.h> 2765b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#include <errno.h> 2865b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#include <locale.h> //LC_MESSAGES 2965b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 3065b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#ifndef TEMP_FAILURE_RETRY 3165b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#define TEMP_FAILURE_RETRY(exp) ({ \ 3265b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng typeof (exp) _rc; \ 3365b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng do { \ 3465b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng _rc = (exp); \ 3565b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng } while (_rc == -1 && errno == EINTR); \ 3665b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng _rc; }) 3765b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#endif 3865b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 3965b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1070 4065b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Chengstatic inline size_t strnlen (const char *__string, size_t __maxlen) 4165b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng{ 4265b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng int len = 0; 4365b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng while (__maxlen-- && *__string++) 4465b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng len++; 4565b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng return len; 4665b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng} 4765b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#endif 4865b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 4965b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Chengstatic inline void *mempcpy (void * __dest, const void * __src, size_t __n) 5065b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng{ 5165b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng memcpy(__dest, __src, __n); 5265b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng return ((char *)__dest) + __n; 5365b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng} 5465b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 5565b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#define __mempcpy mempcpy 5665b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 5765b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#define dgettext(domainname, msgid) dcgettext (domainname, msgid, LC_MESSAGES) 5865b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 5965b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Chengstatic inline void __attribute__((noreturn)) error(int status, int errnum, const char *fmt, ...) 6065b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng{ 6165b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng va_list lst; 6265b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng va_start(lst, fmt); 6365b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng vfprintf(stderr, fmt, lst); 6465b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng fprintf(stderr, "error %d: %s\n", errnum, strerror(errno)); 6565b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng va_end(lst); 6665b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng exit(status); 6765b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng} 6865b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 6965b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Chengstatic inline char *dcgettext (char *__domainname, char *__msgid, int __category) 7065b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng{ 7165b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng error(EXIT_FAILURE, 0, "%s not implemented!", __FUNCTION__); 7265b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng return NULL; 7365b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng} 7465b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 7565b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng/* workaround for canonicalize_file_name */ 7665b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#define canonicalize_file_name(path) realpath(path, NULL) 7765b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 7865b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng/* workaround for open64 */ 7965b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#define open64(path, flags) open(path, flags) 8065b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 8165b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng/* rawmemchr */ 8265b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Chengstatic inline void *rawmemchr(const void *s, int c) 8365b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng{ 8465b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng const unsigned char *ptr = s; 8565b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng while (1) { 8665b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng if (*ptr == c) return (void *) ptr; 8765b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng ptr++; 8865b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng } 8965b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng} 9065b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 9165b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#define strndup(str, size) strdup(str) 9265b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 9365b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Chengstatic void tdestroy(void *root, void (*free_node)(void *nodep)) 9465b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng{ 9565b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng} 9665b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng 9765b3819bcdc2ecbfec9e718d121af9f5fe614069Ben Cheng#endif /* ANDROID_FIXUP_H */ 98