diff options
author | rsc <devnull@localhost> | 2004-03-25 23:03:57 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-03-25 23:03:57 +0000 |
commit | 8ad517944e46710ab832350c0dc3fc4e9239f7e2 (patch) | |
tree | 7b99a1833e1b303719c2aac75e3f7e82482b42ab /src/cmd/9term/rcstart.c | |
parent | cb27443abf3d6af6ab52377c71c843e619928433 (diff) | |
download | plan9port-8ad517944e46710ab832350c0dc3fc4e9239f7e2.tar.gz plan9port-8ad517944e46710ab832350c0dc3fc4e9239f7e2.tar.bz2 plan9port-8ad517944e46710ab832350c0dc3fc4e9239f7e2.zip |
Today's changes.
More changes.
Diffstat (limited to 'src/cmd/9term/rcstart.c')
-rw-r--r-- | src/cmd/9term/rcstart.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/cmd/9term/rcstart.c b/src/cmd/9term/rcstart.c new file mode 100644 index 00000000..7596bc41 --- /dev/null +++ b/src/cmd/9term/rcstart.c @@ -0,0 +1,51 @@ +#include <u.h> +#include <libc.h> +#include "term.h" + +int +rcstart(int argc, char **argv, int *pfd) +{ + int pid; + int fd[2]; + char *xargv[3]; + char slave[256]; + int sfd; + + if(argc == 0){ + argc = 2; + argv = xargv; + argv[0] = getenv("SHELL"); + if(argv[0] == 0) + argv[0] = "rc"; + argv[1] = "-i"; + argv[2] = 0; + } + /* + * fd0 is slave (tty), fd1 is master (pty) + */ + fd[0] = fd[1] = -1; + if(getpts(fd, slave) < 0) + fprint(2, "getpts: %r\n"); + + + switch(pid = fork()) { + case 0: + putenv("TERM", "9term"); + sfd = childpty(fd, slave); + dup(sfd, 0); + dup(sfd, 1); + dup(sfd, 2); + system("stty tabs -onlcr -echo erase ^h intr ^?"); + execvp(argv[0], argv); + fprint(2, "exec %s failed: %r\n", argv[0]); + _exits("oops"); + break; + case -1: + sysfatal("proc failed: %r"); + break; + } + close(fd[0]); + *pfd = fd[1]; + return pid; +} + |