| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -3,6 +3,7 @@ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <sys/types.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <sys/wait.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <ctype.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <err.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <signal.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <stdarg.h> | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					#include <stdio.h> | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -73,7 +74,7 @@ getch() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(rbuf.i++ >= rbuf.n) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							rbuf.n = read(ptm, rbuf.data, LENGTH(rbuf.data)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(rbuf.n == -1) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								eprintn("error, cannot read from slave pty"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								err(EXIT_FAILURE, "cannot read from slave pty"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							rbuf.i = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						return rbuf.data[rbuf.i]; | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -113,7 +114,7 @@ parseesc(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									qmark = 1; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								else if(c == ';') { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									if(!digit) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										eprint("syntax error\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
										errx(EXIT_FAILURE, "syntax error"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									digit = 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									j++; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								} | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -216,7 +217,7 @@ shell(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						pid = fork(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						switch(pid) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						case -1: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							eprint("error, cannot fork\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							err(EXIT_FAILURE, "cannot fork"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						case 0: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							setsid(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							dup2(pts, STDIN_FILENO); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -237,7 +238,7 @@ sigchld(int n) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int ret; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(waitpid(pid, &ret, 0) == -1) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							eprintn("error, waiting for child failed"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							err(EXIT_FAILURE, "waiting for child failed"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(WIFEXITED(ret)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							exit(WEXITSTATUS(ret)); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -257,7 +258,7 @@ unbuffer(void) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					void | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					ungetch(int c) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(rbuf.i + 1 >= rbuf.n) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							eprint("error, read buffer full\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							errx(EXIT_FAILURE, "read buffer full"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						rbuf.data[rbuf.i++] = c; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -266,10 +267,14 @@ main(int argc, char *argv[]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						fd_set rfds; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						int r; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(argc == 2 && !strcmp("-v", argv[1])) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							eprint("std-"VERSION", © 2008 Matthias-Christian Ott\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else if(argc == 1) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							eprint("usage: st [-v]\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						if(argc == 2 && !strcmp("-v", argv[1])) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							fprintf(stderr, "std-"VERSION", © 2008 Matthias-Christian Ott\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							exit(EXIT_SUCCESS); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						else if(argc == 1) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							fprintf(stderr, "usage: st [-v]\n"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							exit(EXIT_FAILURE); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						getpty(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						shell(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						FD_ZERO(&rfds); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -278,7 +283,7 @@ main(int argc, char *argv[]) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
						for(;;) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							r = select(ptm + 1, &rfds, NULL, NULL, NULL); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(r == -1) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								eprintn("error, cannot select"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								err(EXIT_FAILURE, "cannot select"); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
							if(FD_ISSET(ptm, &rfds)) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
								do { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
									c = getch(); | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |