blob: 21dc184c632586c70ed2ecb4b37daf33c8d29bd1 [file] [log] [blame]
/* Android compatibility header
* Provides missing bits in Bionic on Android, ignored
* on regular Linux.
*
* Written by Bernhard.Rosenkranzer@linaro.org
*
* Released into the public domain. Do with this file
* whatever you want.
*/
#ifdef ANDROID
/* Bionic has its own idea about ALIGN, and kills other definitions.
* Done outside the multiple-inclusion wrapper to make sure we
* can override Bionic's ALIGN by simply including compat-android.h
* again after including Bionic headers.
*/
#undef ALIGN
#undef __ALIGN_MASK
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
#ifndef _COMPAT_ANDROID_H_
#define _COMPAT_ANDROID_H_ 1
#include <stdio.h>
#include <signal.h>
#include <asm/page.h> /* for PAGE_SIZE */
#include <asm/termios.h> /* for winsize */
#ifndef __le32 /* Exists on ICS, but not JB */
#define __le32 uint32_t
#endif
#ifndef __WORDSIZE
#include <stdint.h>
#define __WORDSIZE _BITSIZE
#endif
#ifndef roundup
#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
#endif
#ifndef __force
#define __force
#endif
/* Assorted functions that are missing from Bionic */
/* Android prior to 4.2 lacks psignal().
* What we're doing here is fairly evil - but necessary since
* Bionic doesn't export any version identifier or the likes.
* We do know that 4.2 is the version introducing psignal() and
* also KLOG_CONSOLE_OFF -- completely unrelated, but something
* we can check for...
*/
#include <sys/klog.h>
#ifndef KLOG_CONSOLE_OFF
static void psignal(int sig, const char *s)
{
if(sig>=0 && sig<NSIG) {
if(s)
fprintf(stderr, "%s: %s\n", s, sys_siglist[sig]);
else
fprintf(stderr, "%s\n", sys_siglist[sig]);
} else {
if(s)
fprintf(stderr, "%s: invalid signal\n", s);
else
fputs("invalid signal\n", stderr);
}
}
#endif
static ssize_t getline(char **lineptr, size_t *n, FILE *stream)
{
size_t ret = 0;
if (!lineptr || !n || !stream)
return -1;
if(!*lineptr) {
*n = 128;
*lineptr = (char*)malloc(*n);
if(!*lineptr)
return -1;
}
while(!feof(stream) && !ferror(stream)) {
int c;
if(ret == *n) {
*n += 128;
*lineptr = (char*)realloc(*lineptr, *n);
if(!*lineptr) {
*n = 0;
return -1;
}
}
c = fgetc(stream);
if(c == EOF)
break;
*lineptr[ret++] = c;
if(c == '\n')
break;
}
*lineptr[ret] = 0;
return ret;
}
#endif
#endif