int main(int argc, char **argv) { int master_fd; int opt[2]; if (prepare_options(argc, argv, opt)) { if (prepare_tcattr()) { if (open_master(&master_fd)) { if (fork_pty(master_fd, (opt[0] == -1 ? DEFAULT_SCRIPT_ : argv[opt[0]]), opt[1])) { close(master_fd); return (reset_settings()); } close(master_fd); } reset_settings(); } } return (EXIT_FAILURE); }
pid_t forkpty(int *masterp, char *name, struct termios * termp, struct winsize * winp) { int master, slave; char ptname[PATH_MAX]; pid_t pid; master = open_master(ptname, sizeof (ptname)); if (master < 0) { return -1; } slave = open_slave(ptname); if (slave < 0) { close(master); return -1; } if (name) strcpy(name, ptname); if (termp) tcsetattr(slave, TCSAFLUSH, termp); if (winp) ioctl(slave, TIOCSWINSZ, winp); pid = fork(); if (pid < 0) { close(slave); close(master); return -1; } else if (pid == 0) { /* child/slave */ close(master); login_tty(slave); return 0; } /* parent/master */ *masterp = master; close(slave); return pid; }
int main (int argc, char **argv) { int confd,ptyfd,ttyfd; int status,len; char *ptyname; argc--; argv++; if (! *argv) { printf("usage: kbdsh program arguments\n"); exit(-1); } if ((confd = open("/dev/console",O_RDWR,0644)) < 0) { printf("could not open /dev/console\n"); exit (-1); } if ((ptyfd = open_master(&ptyname)) == -1) { printf("could not open master pty\n"); return -1; } if ((ttyfd = open_slave(ptyname)) == -1) { printf("could not open slave of %s\n",ptyname); close(ptyfd); return -1; } if (!fork()) { /* child */ close(ptyfd); close(confd); dup2(ttyfd,0); dup2(ttyfd,1); dup2(ttyfd,2); kprintf("starting: %s\n",*argv); status = execvp(*argv, argv); printf("execvp %s failed %d\n",*argv, status); exit(-1); } else { /* parent */ struct timeval t = { 1 , 0}; close(ttyfd); kprintf("parent\n"); for(;;) { fd_set fdset; FD_ZERO(&fdset); FD_SET(ptyfd,&fdset); if ((len = read(confd,buffer,BSIZE))) { int i; /* remap \n to \r */ for (i = 0; i < len ; i++) { if (buffer[i] == 13) { buffer[i] = 10; } } write(confd,buffer,len); write(ptyfd,buffer,len); } if (select(32,&fdset,0,0,&t)) { len = read(ptyfd,buffer,BSIZE); buffer[len] = 0; write(confd,buffer,len); } if (wait4(0,&status,WNOHANG,0)) { kprintf("child returned: %d\n",status); exit(0); kprintf("BAD\n"); } yield(-1); } } return 0; }