Blob
1 #include <u.h>2 #include <libc.h>3 #include "term.h"5 int6 rcstart(int argc, char **argv, int *pfd)7 {8 int pid;9 int fd[2];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");31 switch(pid = fork()) {32 case 0:33 putenv("TERM", "9term");34 sfd = childpty(fd, slave);35 dup(sfd, 0);36 dup(sfd, 1);37 dup(sfd, 2);38 system("stty tabs -onlcr -echo erase '^h' intr '^?'");39 execvp(argv[0], argv);40 fprint(2, "exec %s failed: %r\n", argv[0]);41 _exits("oops");42 break;43 case -1:44 sysfatal("proc failed: %r");45 break;46 }47 close(fd[0]);48 *pfd = fd[1];49 return pid;50 }