2006-07-10 15:45:14 +04:00
/*
2005-04-17 02:20:36 +04:00
* Copyright ( C ) 2001 Jeff Dike ( jdike @ karaya . com )
* Licensed under the GPL
*/
# include <stdio.h>
# include <termios.h>
# include <errno.h>
# include <unistd.h>
# include "chan_user.h"
# include "user_util.h"
# include "user.h"
# include "os.h"
2006-10-20 10:28:20 +04:00
# include "um_malloc.h"
2005-04-17 02:20:36 +04:00
struct tty_chan {
char * dev ;
int raw ;
struct termios tt ;
} ;
2006-09-27 12:50:33 +04:00
static void * tty_chan_init ( char * str , int device , const struct chan_opts * opts )
2005-04-17 02:20:36 +04:00
{
struct tty_chan * data ;
if ( * str ! = ' : ' ) {
printk ( " tty_init : channel type 'tty' must specify "
" a device \n " ) ;
2006-07-10 15:45:14 +04:00
return NULL ;
2005-04-17 02:20:36 +04:00
}
str + + ;
data = um_kmalloc ( sizeof ( * data ) ) ;
if ( data = = NULL )
2006-07-10 15:45:14 +04:00
return NULL ;
2005-04-17 02:20:36 +04:00
* data = ( ( struct tty_chan ) { . dev = str ,
. raw = opts - > raw } ) ;
2006-07-10 15:45:14 +04:00
return data ;
2005-04-17 02:20:36 +04:00
}
static int tty_open ( int input , int output , int primary , void * d ,
char * * dev_out )
{
struct tty_chan * data = d ;
int fd , err ;
fd = os_open_file ( data - > dev , of_set_rw ( OPENFLAGS ( ) , input , output ) , 0 ) ;
2006-07-10 15:45:14 +04:00
if ( fd < 0 )
return fd ;
2005-04-17 02:20:36 +04:00
if ( data - > raw ) {
CATCH_EINTR ( err = tcgetattr ( fd , & data - > tt ) ) ;
if ( err )
2006-07-10 15:45:14 +04:00
return err ;
2005-04-17 02:20:36 +04:00
err = raw ( fd ) ;
if ( err )
2006-07-10 15:45:14 +04:00
return err ;
2005-04-17 02:20:36 +04:00
}
* dev_out = data - > dev ;
2006-07-10 15:45:14 +04:00
return fd ;
2005-04-17 02:20:36 +04:00
}
2006-09-27 12:50:33 +04:00
const struct chan_ops tty_ops = {
2005-04-17 02:20:36 +04:00
. type = " tty " ,
. init = tty_chan_init ,
. open = tty_open ,
. close = generic_close ,
. read = generic_read ,
. write = generic_write ,
2005-11-14 03:07:10 +03:00
. console_write = generic_console_write ,
2005-04-17 02:20:36 +04:00
. window_size = generic_window_size ,
. free = generic_free ,
. winch = 0 ,
} ;