2005-04-17 02:20:36 +04:00
/* termios.h: generic termios/termio user copying/translation
*/
2009-05-14 02:56:24 +04:00
# ifndef _ASM_GENERIC_TERMIOS_BASE_H
# define _ASM_GENERIC_TERMIOS_BASE_H
2005-04-17 02:20:36 +04:00
# include <asm/uaccess.h>
# ifndef __ARCH_TERMIO_GETPUT
/*
* Translate a " termio " structure into a " termios " . Ugh .
*/
2006-12-08 13:38:45 +03:00
static inline int user_termio_to_kernel_termios ( struct ktermios * termios ,
2005-04-17 02:20:36 +04:00
struct termio __user * termio )
{
unsigned short tmp ;
if ( get_user ( tmp , & termio - > c_iflag ) < 0 )
goto fault ;
termios - > c_iflag = ( 0xffff0000 & termios - > c_iflag ) | tmp ;
if ( get_user ( tmp , & termio - > c_oflag ) < 0 )
goto fault ;
termios - > c_oflag = ( 0xffff0000 & termios - > c_oflag ) | tmp ;
if ( get_user ( tmp , & termio - > c_cflag ) < 0 )
goto fault ;
termios - > c_cflag = ( 0xffff0000 & termios - > c_cflag ) | tmp ;
if ( get_user ( tmp , & termio - > c_lflag ) < 0 )
goto fault ;
termios - > c_lflag = ( 0xffff0000 & termios - > c_lflag ) | tmp ;
if ( get_user ( termios - > c_line , & termio - > c_line ) < 0 )
goto fault ;
if ( copy_from_user ( termios - > c_cc , termio - > c_cc , NCC ) ! = 0 )
goto fault ;
return 0 ;
fault :
return - EFAULT ;
}
/*
* Translate a " termios " structure into a " termio " . Ugh .
*/
static inline int kernel_termios_to_user_termio ( struct termio __user * termio ,
2006-12-08 13:38:45 +03:00
struct ktermios * termios )
2005-04-17 02:20:36 +04:00
{
if ( put_user ( termios - > c_iflag , & termio - > c_iflag ) < 0 | |
put_user ( termios - > c_oflag , & termio - > c_oflag ) < 0 | |
put_user ( termios - > c_cflag , & termio - > c_cflag ) < 0 | |
put_user ( termios - > c_lflag , & termio - > c_lflag ) < 0 | |
put_user ( termios - > c_line , & termio - > c_line ) < 0 | |
copy_to_user ( termio - > c_cc , termios - > c_cc , NCC ) ! = 0 )
return - EFAULT ;
return 0 ;
}
2008-02-08 15:18:39 +03:00
# ifndef user_termios_to_kernel_termios
2005-04-17 02:20:36 +04:00
# define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios))
2008-02-08 15:18:39 +03:00
# endif
# ifndef kernel_termios_to_user_termios
2005-04-17 02:20:36 +04:00
# define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios))
2008-02-08 15:18:39 +03:00
# endif
2007-09-12 19:16:31 +04:00
# define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))
# define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios))
2005-04-17 02:20:36 +04:00
# endif /* __ARCH_TERMIO_GETPUT */
2009-05-14 02:56:24 +04:00
# endif /* _ASM_GENERIC_TERMIOS_BASE_H */