Blob
1 #include <u.h>2 #include <signal.h>3 #include <libc.h>4 #include "term.h"6 int7 rcstart(int argc, char **argv, int *pfd, int *tfd)8 {9 int fd[2], i, pid;10 char *xargv[3];11 char slave[256];12 int sfd;14 if(argc == 0){15 argc = 2;16 argv = xargv;17 argv[0] = getenv("SHELL");18 if(argv[0] == 0)19 argv[0] = "rc";20 argv[1] = "-i";21 argv[2] = 0;22 }23 /*24 * fd0 is slave (tty), fd1 is master (pty)25 */26 fd[0] = fd[1] = -1;27 if(getpts(fd, slave) < 0)28 sysfatal("getpts: %r\n");29 switch(pid = fork()) {30 case 0:31 putenv("TERM", "9term");32 sfd = childpty(fd, slave);33 dup(sfd, 0);34 dup(sfd, 1);35 dup(sfd, 2);36 system("stty tabs -onlcr onocr icanon echo erase '^h' intr '^?'");37 if(noecho)38 system("stty -echo");39 for(i=3; i<100; i++)40 close(i);41 execvp(argv[0], argv);42 fprint(2, "exec %s failed: %r\n", argv[0]);43 _exits("oops");44 break;45 case -1:46 sysfatal("proc failed: %r");47 break;48 }49 *pfd = fd[1];50 close(fd[0]);51 if(tfd){52 if((*tfd = open(slave, OREAD)) < 0)53 sysfatal("parent open %s: %r", slave);54 }55 return pid;56 }