#include <stdarg.h>
#include <sys/ioctl.h>

/* Derived from development/ndk/platforms/android-3/arch-arm/include/asm/ioctls.h */

#define TCGETS_PORTABLE		0x5401
#define TCSETS_PORTABLE		0x5402
#define TCSETSW_PORTABLE	0x5403
#define TCSETSF_PORTABLE	0x5404
#define TCGETA_PORTABLE		0x5405
#define TCSETA_PORTABLE		0x5406
#define TCSETAW_PORTABLE	0x5407
#define TCSETAF_PORTABLE	0x5408
#define TCSBRK_PORTABLE		0x5409
#define TCXONC_PORTABLE		0x540A
#define TCFLSH_PORTABLE		0x540B
#define TIOCEXCL_PORTABLE	0x540C
#define TIOCNXCL_PORTABLE	0x540D
#define TIOCSCTTY_PORTABLE	0x540E
#define TIOCGPGRP_PORTABLE	0x540F
#define TIOCSPGRP_PORTABLE	0x5410
#define TIOCOUTQ_PORTABLE	0x5411
#define TIOCSTI_PORTABLE	0x5412
#define TIOCGWINSZ_PORTABLE	0x5413
#define TIOCSWINSZ_PORTABLE	0x5414
#define TIOCMGET_PORTABLE	0x5415
#define TIOCMBIS_PORTABLE	0x5416
#define TIOCMBIC_PORTABLE	0x5417
#define TIOCMSET_PORTABLE	0x5418
#define TIOCGSOFTCAR_PORTABLE	0x5419
#define TIOCSSOFTCAR_PORTABLE	0x541A
#define FIONREAD_PORTABLE	0x541B
#define TIOCINQ_PORTABLE	FIONREAD_PORTABLE
#define TIOCLINUX_PORTABLE	0x541C
#define TIOCCONS_PORTABLE	0x541D
#define TIOCGSERIAL_PORTABLE	0x541E
#define TIOCSSERIAL_PORTABLE	0x541F
#define TIOCPKT_PORTABLE	0x5420
#define FIONBIO_PORTABLE	0x5421
#define TIOCNOTTY_PORTABLE	0x5422
#define TIOCSETD_PORTABLE	0x5423
#define TIOCGETD_PORTABLE	0x5424
#define TCSBRKP_PORTABLE	0x5425
#define TIOCSBRK_PORTABLE	0x5427
#define TIOCCBRK_PORTABLE	0x5428
#define TIOCGSID_PORTABLE	0x5429
//#define TIOCGPTN _IOR('T',0x30, unsigned int)
//#define TIOCSPTLCK _IOW('T',0x31, int)

#define FIONCLEX_PORTABLE	0x5450
#define FIOCLEX_PORTABLE	0x5451
#define FIOASYNC_PORTABLE	0x5452
#define TIOCSERCONFIG_PORTABLE	0x5453
#define TIOCSERGWILD_PORTABLE	0x5454
#define TIOCSERSWILD_PORTABLE	0x5455
#define TIOCGLCKTRMIOS_PORTABLE	0x5456
#define TIOCSLCKTRMIOS_PORTABLE	0x5457
#define TIOCSERGSTRUCT_PORTABLE	0x5458
#define TIOCSERGETLSR_PORTABLE	0x5459
#define TIOCSERGETMULTI_PORTABLE 0x545A
#define TIOCSERSETMULTI_PORTABLE 0x545B

#define TIOCMIWAIT_PORTABLE	0x545C
#define TIOCGICOUNT_PORTABLE	0x545D
#define FIOQSIZE_PORTABLE	0x545E /* x86 differs here */

#define TIOCPKT_DATA_PORTABLE		0
#define TIOCPKT_FLUSHREAD_PORTABLE	1
#define TIOCPKT_FLUSHWRITE_PORTABLE	2
#define TIOCPKT_STOP_PORTABLE		4
#define TIOCPKT_START_PORTABLE		8
#define TIOCPKT_NOSTOP_PORTABLE		16
#define TIOCPKT_DOSTOP_PORTABLE		32

#define TIOCSER_TEMT_PORTABLE	0x01

#if FIONREAD_PORTABLE==FIONREAD
#error Build environment
#endif

static inline int mips_change_request(int request)
{
    /* Only handles FIO* for now */
    switch(request) {
    case FIONREAD_PORTABLE:
	return FIONREAD;
    case FIONBIO_PORTABLE:
	return FIONBIO;
    case FIONCLEX_PORTABLE:
	return FIONCLEX;
    case FIOCLEX_PORTABLE:
	return FIOCLEX;
    case FIOASYNC_PORTABLE:
	return FIOASYNC;
    case FIOQSIZE_PORTABLE:
	return FIOQSIZE;
    }
    return request;
}

extern int __ioctl(int, int, void *);
int ioctl(int fd, int request, ...)
{
    va_list ap;
    void * arg;

    va_start(ap, request);
    arg = va_arg(ap, void *);
    va_end(ap);

    return __ioctl(fd, mips_change_request(request), arg);
}