@ -352,6 +352,7 @@ static void draw(void);
static void redraw ( void ) ;
static void redraw ( void ) ;
static void drawregion ( int , int , int , int ) ;
static void drawregion ( int , int , int , int ) ;
static void execsh ( void ) ;
static void execsh ( void ) ;
static void stty ( void ) ;
static void sigchld ( int ) ;
static void sigchld ( int ) ;
static void run ( void ) ;
static void run ( void ) ;
@ -508,6 +509,7 @@ static char *opt_title = NULL;
static char * opt_embed = NULL ;
static char * opt_embed = NULL ;
static char * opt_class = NULL ;
static char * opt_class = NULL ;
static char * opt_font = NULL ;
static char * opt_font = NULL ;
static char * opt_line = NULL ;
static int oldbutton = 3 ; /* button event on startup: 3 = release */
static int oldbutton = 3 ; /* button event on startup: 3 = release */
static char * usedfont = NULL ;
static char * usedfont = NULL ;
@ -1253,11 +1255,55 @@ sigchld(int a) {
exit ( EXIT_SUCCESS ) ;
exit ( EXIT_SUCCESS ) ;
}
}
void
stty ( void )
{
char cmd [ _POSIX_ARG_MAX ] , * * p , * q , * s ;
size_t n , siz ;
if ( ( n = strlen ( stty_args ) ) > sizeof ( cmd ) - 1 )
die ( " incorrect stty parameters \n " ) ;
memcpy ( cmd , stty_args , n ) ;
q = cmd + n ;
siz = sizeof ( cmd ) - n ;
for ( p = opt_cmd ; p & & ( s = * p ) ; + + p ) {
if ( ( n = strlen ( s ) ) > siz - 1 )
die ( " stty parameter length too long \n " ) ;
* q + + = ' ' ;
q = memcpy ( q , s , n ) ;
q + = n ;
siz - = n + 1 ;
}
* q = ' \0 ' ;
system ( cmd ) ;
}
void
void
ttynew ( void ) {
ttynew ( void ) {
int m , s ;
int m , s ;
struct winsize w = { term . row , term . col , 0 , 0 } ;
struct winsize w = { term . row , term . col , 0 , 0 } ;
if ( opt_io ) {
term . mode | = MODE_PRINT ;
iofd = ( ! strcmp ( opt_io , " - " ) ) ?
STDOUT_FILENO :
open ( opt_io , O_WRONLY | O_CREAT , 0666 ) ;
if ( iofd < 0 ) {
fprintf ( stderr , " Error opening %s:%s \n " ,
opt_io , strerror ( errno ) ) ;
}
}
if ( opt_line ) {
if ( ( cmdfd = open ( opt_line , O_RDWR ) ) < 0 )
die ( " open line failed: %s \n " , strerror ( errno ) ) ;
close ( STDIN_FILENO ) ;
dup ( cmdfd ) ;
stty ( ) ;
return ;
}
/* seems to work fine on linux, openbsd and freebsd */
/* seems to work fine on linux, openbsd and freebsd */
if ( openpty ( & m , & s , NULL , NULL , & w ) < 0 )
if ( openpty ( & m , & s , NULL , NULL , & w ) < 0 )
die ( " openpty failed: %s \n " , strerror ( errno ) ) ;
die ( " openpty failed: %s \n " , strerror ( errno ) ) ;
@ -1267,6 +1313,7 @@ ttynew(void) {
die ( " fork failed \n " ) ;
die ( " fork failed \n " ) ;
break ;
break ;
case 0 :
case 0 :
close ( iofd ) ;
setsid ( ) ; /* create a new process group */
setsid ( ) ; /* create a new process group */
dup2 ( s , STDIN_FILENO ) ;
dup2 ( s , STDIN_FILENO ) ;
dup2 ( s , STDOUT_FILENO ) ;
dup2 ( s , STDOUT_FILENO ) ;
@ -1281,16 +1328,6 @@ ttynew(void) {
close ( s ) ;
close ( s ) ;
cmdfd = m ;
cmdfd = m ;
signal ( SIGCHLD , sigchld ) ;
signal ( SIGCHLD , sigchld ) ;
if ( opt_io ) {
term . mode | = MODE_PRINT ;
iofd = ( ! strcmp ( opt_io , " - " ) ) ?
STDOUT_FILENO :
open ( opt_io , O_WRONLY | O_CREAT , 0666 ) ;
if ( iofd < 0 ) {
fprintf ( stderr , " Error opening %s:%s \n " ,
opt_io , strerror ( errno ) ) ;
}
}
break ;
break ;
}
}
}
}
@ -4009,9 +4046,11 @@ run(void) {
void
void
usage ( void ) {
usage ( void ) {
die ( " %s " VERSION " (c) 2010-2015 st engineers \n " \
die ( " %s " VERSION " (c) 2010-2015 st engineers \n "
" usage: st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file] \n "
" usage: st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file] \n "
" [-i] [-t title] [-w windowid] [-e command ...] [command ...] \n " ,
" [-i] [-t title] [-w windowid] [-e command ...] [command ...] \n "
" st [-a] [-v] [-c class] [-f font] [-g geometry] [-o file] \n "
" [-i] [-t title] [-w windowid] [-l line] [stty_args ...] \n " ,
argv0 ) ;
argv0 ) ;
}
}
@ -4047,6 +4086,9 @@ main(int argc, char *argv[]) {
case ' o ' :
case ' o ' :
opt_io = EARGF ( usage ( ) ) ;
opt_io = EARGF ( usage ( ) ) ;
break ;
break ;
case ' l ' :
opt_line = EARGF ( usage ( ) ) ;
break ;
case ' t ' :
case ' t ' :
opt_title = EARGF ( usage ( ) ) ;
opt_title = EARGF ( usage ( ) ) ;
break ;
break ;