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