@ -136,8 +136,7 @@ typedef struct {
int narg ; /* nb of args */
int narg ; /* nb of args */
} STREscape ;
} STREscape ;
static void execsh ( char * , char * * ) ;
static void execsh ( char * * ) ;
static void stty ( char * * ) ;
static void stty ( char * * ) ;
static void sigchld ( int ) ;
static void sigchld ( int ) ;
static void ttywriteraw ( const char * , size_t ) ;
static void ttywriteraw ( const char * , size_t ) ;
@ -201,15 +200,13 @@ static char *base64dec(const char *);
static ssize_t xwrite ( int , const char * , size_t ) ;
static ssize_t xwrite ( int , const char * , size_t ) ;
/* Globals */
/* Globals */
int cmdfd ;
pid_t pid ;
int oldbutton = 3 ; /* button event on startup: 3 = release */
static Term term ;
static Term term ;
static Selection sel ;
static Selection sel ;
static CSIEscape csiescseq ;
static CSIEscape csiescseq ;
static STREscape strescseq ;
static STREscape strescseq ;
static int iofd = 1 ;
static int iofd = 1 ;
static int cmdfd ;
static pid_t pid ;
static uchar utfbyte [ UTF_SIZ + 1 ] = { 0x80 , 0 , 0xC0 , 0xE0 , 0xF0 } ;
static uchar utfbyte [ UTF_SIZ + 1 ] = { 0x80 , 0 , 0xC0 , 0xE0 , 0xF0 } ;
static uchar utfmask [ UTF_SIZ + 1 ] = { 0xC0 , 0x80 , 0xE0 , 0xF0 , 0xF8 } ;
static uchar utfmask [ UTF_SIZ + 1 ] = { 0xC0 , 0x80 , 0xE0 , 0xF0 , 0xF8 } ;
@ -659,7 +656,7 @@ die(const char *errstr, ...)
}
}
void
void
execsh ( char * * args )
execsh ( char * cmd , char * * args )
{
{
char * sh , * prog ;
char * sh , * prog ;
const struct passwd * pw ;
const struct passwd * pw ;
@ -673,7 +670,7 @@ execsh(char **args)
}
}
if ( ( sh = getenv ( " SHELL " ) ) = = NULL )
if ( ( sh = getenv ( " SHELL " ) ) = = NULL )
sh = ( pw - > pw_shell [ 0 ] ) ? pw - > pw_shell : shell ;
sh = ( pw - > pw_shell [ 0 ] ) ? pw - > pw_shell : cmd ;
if ( args )
if ( args )
prog = args [ 0 ] ;
prog = args [ 0 ] ;
@ -745,8 +742,8 @@ stty(char **args)
perror ( " Couldn't call stty " ) ;
perror ( " Couldn't call stty " ) ;
}
}
void
int
ttynew ( char * line , char * out, char * * args )
ttynew ( char * line , char * cmd, char * out, char * * args )
{
{
int m , s ;
int m , s ;
@ -765,7 +762,7 @@ ttynew(char *line, char *out, char **args)
die ( " open line failed: %s \n " , strerror ( errno ) ) ;
die ( " open line failed: %s \n " , strerror ( errno ) ) ;
dup2 ( cmdfd , 0 ) ;
dup2 ( cmdfd , 0 ) ;
stty ( args ) ;
stty ( args ) ;
return ;
return cmdfd ;
}
}
/* seems to work fine on linux, openbsd and freebsd */
/* seems to work fine on linux, openbsd and freebsd */
@ -786,7 +783,7 @@ ttynew(char *line, char *out, char **args)
die ( " ioctl TIOCSCTTY failed: %s \n " , strerror ( errno ) ) ;
die ( " ioctl TIOCSCTTY failed: %s \n " , strerror ( errno ) ) ;
close ( s ) ;
close ( s ) ;
close ( m ) ;
close ( m ) ;
execsh ( args) ;
execsh ( cmd, args) ;
break ;
break ;
default :
default :
close ( s ) ;
close ( s ) ;
@ -794,6 +791,7 @@ ttynew(char *line, char *out, char **args)
signal ( SIGCHLD , sigchld ) ;
signal ( SIGCHLD , sigchld ) ;
break ;
break ;
}
}
return cmdfd ;
}
}
size_t
size_t
@ -916,6 +914,13 @@ ttyresize(int tw, int th)
fprintf ( stderr , " Couldn't set window size: %s \n " , strerror ( errno ) ) ;
fprintf ( stderr , " Couldn't set window size: %s \n " , strerror ( errno ) ) ;
}
}
void
ttyhangup ( )
{
/* Send SIGHUP to shell */
kill ( pid , SIGHUP ) ;
}
int
int
tattrset ( int attr )
tattrset ( int attr )
{
{