/*
 * Copyright 2012, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
*/

#ifndef _IOCTLS_PORTABLE_H_
#define _IOCTLS_PORTABLE_H_

/* Derived from development/ndk/platforms/android-3/include/asm-generic/ioctl.h */

#define _IOC_NRBITS_PORTABLE 8
#define _IOC_TYPEBITS_PORTABLE 8
#define _IOC_SIZEBITS_PORTABLE 14
#define _IOC_DIRBITS_PORTABLE 2

#define _IOC_NRMASK_PORTABLE ((1 << _IOC_NRBITS_PORTABLE)-1)
#define _IOC_TYPEMASK_PORTABLE ((1 << _IOC_TYPEBITS_PORTABLE)-1)
#define _IOC_SIZEMASK_PORTABLE ((1 << _IOC_SIZEBITS_PORTABLE)-1)
#define _IOC_DIRMASK_PORTABLE ((1 << _IOC_DIRBITS_PORTABLE)-1)

#define _IOC_NRSHIFT_PORTABLE 0
#define _IOC_TYPESHIFT_PORTABLE (_IOC_NRSHIFT_PORTABLE+_IOC_NRBITS_PORTABLE)
#define _IOC_SIZESHIFT_PORTABLE (_IOC_TYPESHIFT_PORTABLE+_IOC_TYPEBITS_PORTABLE)
#define _IOC_DIRSHIFT_PORTABLE (_IOC_SIZESHIFT_PORTABLE+_IOC_SIZEBITS_PORTABLE)

#define _IOC_NONE_PORTABLE 0U
#define _IOC_WRITE_PORTABLE 1U
#define _IOC_READ_PORTABLE 2U

#define _IOC_PORTABLE(dir,type,nr,size)   (((dir) << _IOC_DIRSHIFT_PORTABLE) |   ((type) << _IOC_TYPESHIFT_PORTABLE) |   ((nr) << _IOC_NRSHIFT_PORTABLE) |   ((size) << _IOC_SIZESHIFT_PORTABLE))

extern unsigned int __invalid_size_argument_for_IOC;
#define _IOC_TYPECHECK_PORTABLE(t)   ((sizeof(t) == sizeof(t[1]) &&   sizeof(t) < (1 << _IOC_SIZEBITS_PORTABLE)) ?   sizeof(t) : __invalid_size_argument_for_IOC)

#define _IO_PORTABLE(type,nr) _IOC_PORTABLE(_IOC_NONE_PORTABLE,(type),(nr),0)
#define _IOR_PORTABLE(type,nr,size) _IOC_PORTABLE(_IOC_READ_PORTABLE,(type),(nr),(_IOC_TYPECHECK_PORTABLE(size)))
#define _IOW_PORTABLE(type,nr,size) _IOC_PORTABLE(_IOC_WRITE_PORTABLE,(type),(nr),(_IOC_TYPECHECK_PORTABLE(size)))
#define _IOWR_PORTABLE(type,nr,size) _IOC_PORTABLE(_IOC_READ_PORTABLE|_IOC_WRITE_PORTABLE,(type),(nr),(_IOC_TYPECHECK_PORTABLE(size)))

/* 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_PORTABLE _IOR_PORTABLE('T',0x30, unsigned int)
#define TIOCSPTLCK_PORTABLE _IOW_PORTABLE('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

/* Derived from development/ndk/platforms/android-3/include/sys/ioctl_compat.h */

struct tchars_portable {
        char    t_intrc;        /* interrupt */
        char    t_quitc;        /* quit */
        char    t_startc;       /* start output */
        char    t_stopc;        /* stop output */
        char    t_eofc;         /* end-of-file */
        char    t_brkc;         /* input delimiter (like nl) */
};

struct ltchars_portable {
        char    t_suspc;        /* stop process signal */
        char    t_dsuspc;       /* delayed stop process signal */
        char    t_rprntc;       /* reprint line */
        char    t_flushc;       /* flush output (toggles) */
        char    t_werasc;       /* word erase */
        char    t_lnextc;       /* literal next character */
};

struct sgttyb_portable {
        char    sg_ispeed;              /* input speed */
        char    sg_ospeed;              /* output speed */
        char    sg_erase;               /* erase character */
        char    sg_kill;                /* kill character */
        short   sg_flags;               /* mode flags */
};

#ifdef USE_OLD_TTY
# define TIOCGETD_PORTABLE   _IOR_PORTABLE('t', 0, int)       /* get line discipline */
# define TIOCSETD_PORTABLE   _IOW_PORTABLE('t', 1, int)       /* set line discipline */
#else
# define OTIOCGETD_PORTABLE  _IOR_PORTABLE('t', 0, int)       /* get line discipline */
# define OTIOCSETD_PORTABLE  _IOW_PORTABLE('t', 1, int)       /* set line discipline */
#endif
#define TIOCHPCL_PORTABLE    _IO_PORTABLE('t', 2)             /* hang up on last close */
#define TIOCGETP_PORTABLE    _IOR_PORTABLE('t', 8,struct sgttyb_portable)/* get parameters -- gtty */
#define TIOCSETP_PORTABLE    _IOW_PORTABLE('t', 9,struct sgttyb_portable)/* set parameters -- stty */
#define TIOCSETN_PORTABLE    _IOW_PORTABLE('t',10,struct sgttyb_portable)/* as above, but no flushtty*/
#define TIOCSETC_PORTABLE    _IOW_PORTABLE('t',17,struct tchars_portable)/* set special characters */
#define TIOCGETC_PORTABLE    _IOR_PORTABLE('t',18,struct tchars_portable)/* get special characters */

#define TIOCLBIS_PORTABLE    _IOW_PORTABLE('t', 127, int)     /* bis local mode bits */
#define TIOCLBIC_PORTABLE    _IOW_PORTABLE('t', 126, int)     /* bic local mode bits */
#define TIOCLSET_PORTABLE    _IOW_PORTABLE('t', 125, int)     /* set entire local mode word */
#define TIOCLGET_PORTABLE    _IOR_PORTABLE('t', 124, int)     /* get local modes */
#define TIOCSLTC_PORTABLE    _IOW_PORTABLE('t',117,struct ltchars_portable)/* set local special chars*/
#define TIOCGLTC_PORTABLE    _IOR_PORTABLE('t',116,struct ltchars_portable)/* get local special chars*/
#define OTIOCCONS_PORTABLE   _IO_PORTABLE('t', 98)    /* for hp300 -- sans int arg */

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

#define FIOSETOWN_PORTABLE 0x8901
#define SIOCSPGRP_PORTABLE 0x8902
#define FIOGETOWN_PORTABLE 0x8903
#define SIOCGPGRP_PORTABLE 0x8904
#define SIOCATMARK_PORTABLE 0x8905
#define SIOCGSTAMP_PORTABLE 0x8906

#endif /* _IOCTLS_PORTABLE_H */
