Add tty line support
Not always is desirable to create a pseudo terminal, and some times we want to open a terminal emulator over a tty line. With this new patch is possible to do someting like: $ st -l /dev/ttyS0 115200 Without this option was needed to launch another terminal emulator over st (for example minicom, picocom, cu, ...).
This commit is contained in:
		@@ -9,6 +9,7 @@ static char font[] = "Liberation Mono:pixelsize=12:antialias=false:autohint=fals
 | 
				
			|||||||
static int borderpx = 2;
 | 
					static int borderpx = 2;
 | 
				
			||||||
static char shell[] = "/bin/sh";
 | 
					static char shell[] = "/bin/sh";
 | 
				
			||||||
static char *utmp = NULL;
 | 
					static char *utmp = NULL;
 | 
				
			||||||
 | 
					static char stty_args[] = "stty raw -echo -iexten echonl";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* identification sequence returned in DA and DECID */
 | 
					/* identification sequence returned in DA and DECID */
 | 
				
			||||||
static char vtiden[] = "\033[?6c";
 | 
					static char vtiden[] = "\033[?6c";
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										37
									
								
								st.1
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								st.1
									
									
									
									
									
								
							@@ -15,11 +15,36 @@ st \- simple terminal
 | 
				
			|||||||
.IR file ]
 | 
					.IR file ]
 | 
				
			||||||
.RB [ \-t 
 | 
					.RB [ \-t 
 | 
				
			||||||
.IR title ]
 | 
					.IR title ]
 | 
				
			||||||
 | 
					.RB [ \-l
 | 
				
			||||||
 | 
					.IR line ]
 | 
				
			||||||
.RB [ \-w 
 | 
					.RB [ \-w 
 | 
				
			||||||
.IR windowid ]
 | 
					.IR windowid ]
 | 
				
			||||||
.RB [ \-v ]
 | 
					.RB [ \-v ]
 | 
				
			||||||
.RB [ \-e
 | 
					.RB [ \-e
 | 
				
			||||||
.IR command ...]
 | 
					.IR command ...]
 | 
				
			||||||
 | 
					.RI [ commands ...]
 | 
				
			||||||
 | 
					.PP
 | 
				
			||||||
 | 
					.B st
 | 
				
			||||||
 | 
					.RB [ \-a ]
 | 
				
			||||||
 | 
					.RB [ \-c
 | 
				
			||||||
 | 
					.IR class ]
 | 
				
			||||||
 | 
					.RB [ \-f
 | 
				
			||||||
 | 
					.IR font ]
 | 
				
			||||||
 | 
					.RB [ \-g
 | 
				
			||||||
 | 
					.IR geometry ]
 | 
				
			||||||
 | 
					.RB [ \-i ]
 | 
				
			||||||
 | 
					.RB [ \-o
 | 
				
			||||||
 | 
					.IR file ]
 | 
				
			||||||
 | 
					.RB [ \-t
 | 
				
			||||||
 | 
					.IR title ]
 | 
				
			||||||
 | 
					.RB [ \-l
 | 
				
			||||||
 | 
					.IR line ]
 | 
				
			||||||
 | 
					.RB [ \-w
 | 
				
			||||||
 | 
					.IR windowid ]
 | 
				
			||||||
 | 
					.RB [ \-v ]
 | 
				
			||||||
 | 
					.RB [ \-l
 | 
				
			||||||
 | 
					.IR line ]
 | 
				
			||||||
 | 
					.RI [ stty_args ...]
 | 
				
			||||||
.SH DESCRIPTION
 | 
					.SH DESCRIPTION
 | 
				
			||||||
.B st
 | 
					.B st
 | 
				
			||||||
is a simple terminal emulator.
 | 
					is a simple terminal emulator.
 | 
				
			||||||
@@ -58,6 +83,11 @@ defines the window title (default 'st').
 | 
				
			|||||||
embeds st within the window identified by 
 | 
					embeds st within the window identified by 
 | 
				
			||||||
.I windowid
 | 
					.I windowid
 | 
				
			||||||
.TP
 | 
					.TP
 | 
				
			||||||
 | 
					.BI \-l " line"
 | 
				
			||||||
 | 
					use a tty line instead of a pseudo terminal.
 | 
				
			||||||
 | 
					When this flag is used
 | 
				
			||||||
 | 
					remaining arguments are used as flags for stty.
 | 
				
			||||||
 | 
					.TP
 | 
				
			||||||
.B \-v
 | 
					.B \-v
 | 
				
			||||||
prints version information to stderr, then exits.
 | 
					prints version information to stderr, then exits.
 | 
				
			||||||
.TP
 | 
					.TP
 | 
				
			||||||
@@ -67,6 +97,9 @@ st executes
 | 
				
			|||||||
instead of the shell.  If this is used it
 | 
					instead of the shell.  If this is used it
 | 
				
			||||||
.B must be the last option
 | 
					.B must be the last option
 | 
				
			||||||
on the command line, as in xterm / rxvt.
 | 
					on the command line, as in xterm / rxvt.
 | 
				
			||||||
 | 
					This option is only intended for compability,
 | 
				
			||||||
 | 
					and all the remaining arguments are used as a command
 | 
				
			||||||
 | 
					even without it.
 | 
				
			||||||
.SH SHORTCUTS
 | 
					.SH SHORTCUTS
 | 
				
			||||||
.TP
 | 
					.TP
 | 
				
			||||||
.B Ctrl-Print Screen
 | 
					.B Ctrl-Print Screen
 | 
				
			||||||
@@ -110,7 +143,9 @@ See the LICENSE file for the authors.
 | 
				
			|||||||
.SH LICENSE
 | 
					.SH LICENSE
 | 
				
			||||||
See the LICENSE file for the terms of redistribution.
 | 
					See the LICENSE file for the terms of redistribution.
 | 
				
			||||||
.SH SEE ALSO
 | 
					.SH SEE ALSO
 | 
				
			||||||
.BR tabbed (1)
 | 
					.BR tabbed (1),
 | 
				
			||||||
 | 
					.BR utmp (1),
 | 
				
			||||||
 | 
					.BR stty (1)
 | 
				
			||||||
.SH BUGS
 | 
					.SH BUGS
 | 
				
			||||||
See the TODO file in the distribution.
 | 
					See the TODO file in the distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										66
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										66
									
								
								st.c
									
									
									
									
									
								
							@@ -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;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user